Problem s odkazy, zrejme elemetarni nevedomost
- simekadam
- Člen | 36
Zdravim, tak jsem si zacal s Nette a uz jsem se zaseknul. Nejak mi nefunguji odkazy, tak jak bych chtel.
Mam svuj zakladni DefaultPresenter a potom nejaky dalsi jako ContactPresenter,..Ve slozce templates mam @layout.phtml a pote vzdy slozku podle presenteru a v kazde pote nejake sablony.
Problem je, ze kdyz v @layout.phtml zavolam {link Contact:}, tak mi to napise, 404 jdi do haje. Zkousel jsem vsemozne variace, ale proste mi to porad hleda v DefaultPresenteru, aspon mi to tak prislo.
Rikal jsem si, jestli neni nejak chyba v routovani, nastaveni mam takove:
<?php
$router = $application->getRouter();
$router[] = new Route('index.php', array(
'presenter' => 'default',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'default',
'action' => 'default',
'id' => NULL,
));
?>
Samotne routovani funguje, kdyz mu nastavim natvrdo jinej vychozi presenter, tak mi to funguje, ale ty odkazy proste ne..Ja jsem asi nejak zle pochopil jak to ma fungovat, pritom jsem ale koukal do dokumentace na generovani odkazu a je to tam podobne, ne-stejne.
Jeste me napadlo, prava jsou urcite v poradku, v zoufalstvi jsem si vsude nastavil 999:)
Diky moc za rady
- warp
- Člen | 26
Ta 404ka ti urcite krome „di do haje“ napsala i jiny parametry ;)
Pro zacatek bych zkusil overit, jestli mas ve slozce „app/templates/Contact/“ soubor „default.phtml“.
//edit: pripadne za dvojtecku v odkazu dat primo nazev souboru v te slozce, napr: Contact:add nebo neco takovyho (jestli mas soubor add.phtml)
Editoval warp (30. 11. 2010 8:26)
- Šaman
- Člen | 2666
Zkus použít {plink Contact:}
Dokud nebudeš vytvářet komponenty, tak vždycky plink. A až budeš dělat komponenty, tak už to budeš znát..
// Edit: jo a samozřejmě v tom presenteru musíš mít nějakou
renderDefault
metodu – tedy pohled který se jmenuje Default.
(Jen pro upřesnění – ta render Default metoda není nutná, stačí
default.phtml šablona, ale já doporučuji pro každý pohled metodu
v presenteru vytvořit i kdyby měla být prázdná. Zlepšuje to
čitelnost.)
Editoval Šaman (30. 11. 2010 9:10)
- simekadam
- Člen | 36
Diky za rychlou odpoved
@warp No chyba je klasicky: The requested URL
/AgenturaSport/document_root/contact/ was not found on this server.
Zkousel jsem davat za dvojtecku i to default a nic, soubod default.phtml
existuje a je ve slozce app/templates/Contact, prava na cteni jsou
v poradku.
@Saman uz jsem si myslel, ze mam vyhrano, v ContactPresenteru jsem mel metodu renderContact, ale i kdyz jsem pridal renderDefault (prazdnou), tak to nic nedela a to ani s plink a ani s link. Vypisuje to teda tu 404ku, neni mozny, ze mam neco spatne nasteveny, nebo neco nemam zaply?
Pro jistotu posilam svuj bootstrap.php
<?php
use Nette\Debug,
Nette\Application\Route,
Nette\Environment,
Nette\Application\SimpleRouter,
Nette\Framework,
Nette\Application\Presenter;
require LIBS_DIR . '/Nette/loader.php';
Debug::enable();
Environment::loadConfig();
$session = Environment::getSession();
$session->setSavePath(APP_DIR . '/sessions/');
$application = Environment::getApplication();
//$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;
$router = $application->getRouter();
$router[] = new Route('index.php', array(
'presenter' => 'default',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'default',
'action' => 'default',
'id' => NULL,
));
$application->run();
?>
V souvislosti s temy komponentami, me napadl trochu OT dotaz, tak snad me neukamenujete:) Pokud si vytvorim svoji factory treba createComponentHelloWorld, kde si vytvorim tlacitko s onClick udalosti, tak ta udalost, pokud to bude odkaz bude tedy link? Respektive, cetl jsem nejaky rozdily mezi link a plink, ale prave jsem uplne nepochopil jakej je rozdil mezi odkazu „nad komponentou“ a odkazu „nad presenterem“ A i tohle tlacitko vlozim do sablony pres {control helloWorld}? Nebo me pouze mate nazev tovarnicky createComponent… a ta prava komponenta je uplne neco jinyho?:D
- Šaman
- Člen | 2666
Nějak se mi nezdá ta adresa:
/AgenturaSport/document_root/contact/
. To vypadá že hledá
soubor, ale neadresuje to presenter a akci. Ta adresa by měla být ve tvaru
<serverName>/contact (pro defaultní pohled). Zkus přepsat routy a
nastavit default presenter na contact
. Spustí se to, nebo
vyskočí nějaká chyba?
- simekadam
- Člen | 36
No kdyz jsem mel jako default v routovani presenter Contact, tak se mi to zobrazilo spravne..K ty ceste..localhost ma koren v Sites a z toho potom jde to AgenturaSport/document_root/…
Jo ale kdyz nastavim contact jako rewrite i pro index.php, tak to, kdyz zadam do url nakonec index.php, vyhodi tu stejnou chybu 404 jako jsem psal.
- simekadam
- Člen | 36
ano to by mohlo byt ono..ale pokud nastavim do .htaccess RewriteBase na /AgenturaSport, tak to nepomuze..asi to nastvuju nejak spatne.Zkousel jsem to pridat i do htaccess co je v app, ale od toho jsem snad ani necekal, ze by pomohlo.
Nevite nekdo tedy, jak presne by mel byt ten RewriteBase nastaveny? Ta moje struktura je, ze mam koren localu v Sites a tenhle site v Sites/AgenturaSport/(sem jsem dal skeleton)
Diky za pomoc
- simekadam
- Člen | 36
Zdravim..Po celkem dlouhe dobe jsem se dostal zpet k laborovani s Nette, proto ta odmlka..Zkousel jsem vsemozne nastavit .htaccess, ale nic porad pretrvava problem 404. Requirements checker mi ale vypisuje warning ze prej nejaky .htacess file protection..
Zkousel jsem trochu pohledat a to ma asi znamenat, ze neni povoleny .htaccess? Ale v httpd.conf mam pro svuj root direktivu AllowOverride nastavenou na All..Ale v jinejch projektech na stejnym serveru mi normalne mod_rewrite slape..Nevite nekdo co s tim?Diky moc
- simekadam
- Člen | 36
Tak jsem zkusil simple router a je to funkcni, takze stoprocentne problem nekde v .htaccess.
`
# disable directory listing
Options -Indexes
# mod_rewrite
RewriteEngine On
RewriteBase AgenturaSport/document_root/
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
`
Tohle je muj .htaccess, tu rewritebase jsem zkousel ruzne modifikovat, ale nepomaha to..
Tohle je muj bootstrap, takhle je to funkcni ta puvodni routa je zakomentovana nad tim simpleRouterem.
<?php
use Nette\Debug,
Nette\Application\Route,
Nette\Environment,
Nette\Application\SimpleRouter,
Nette\Framework,
Nette\Application\Presenter;
require LIBS_DIR . '/Nette/loader.php';
Debug::enable();
Environment::loadConfig();
$session = Environment::getSession();
$session->setSavePath(APP_DIR . '/sessions/');
$application = Environment::getApplication();
//$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;
$router = $application->getRouter();
//$router[] = new Route('index.php', array(
// 'presenter' => 'contact',
// 'action' => 'default',
//), Route::ONE_WAY);
//
//$router[] = new Route('<presenter>/<action>', array(
// 'presenter' => 'default',
// 'action' => 'default',
// 'id' => NULL,
//));
$router[] = new SimpleRouter('Default:default');
$application->run();
?>
Jo jeste dodam, ze v httpd.conf mam pro svuj root localhostu nastaveno AllowOverride All a ze .htaccess, ktery jsem si psal sam, tak funguje, napriklad
RewriteEngine on
RewriteRule ^/([a-zA-Z])\.html$ /$1 [R]
Podotykam, ze requirementsChecker mi hlasi warning „.htaccess file protection“, ale jak jsem psal, nemam paru co to znamena. Jinak v tomhle vlaknu mel nekdo asi stejnej problem jako ja, zel jsem se tam nedohrabal reseni
- natrim
- Člen | 73
mas slozku ‚AgenturaSport‘ opravdu takto pojmenovanou? Opravdu hodne zalezi na velikosti pismen.
jinak jak bych psal ten htacces raci takto
Options -Indexes
Options +FollowSymLinks
ServerSignature Off
# mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /AgenturaSport/
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
</IfModule>
Editoval natrim (14. 12. 2010 8:40)
- simekadam
- Člen | 36
Tak ani to pridani
Options -Indexes
Options +FollowSymLinks
ServerSignature Off
do .htaccess nepomohlo, fakt uz jsem zoufalej, mel vubec nekdo podobny problem?Krome toho zmineneho topicu..Je to fakt dost divny, zatim mi vzdycky na localu vsechno fungovalo bez potizi, takze me tohle fakt vytaci..Tak znovu..Jestli se nepletu, tak RewriteBase se bere relativne vzhledem k .htaccess, takze kdyz ho mam v document_root, tak by vlastne mela byt proste stejna jako je umisteni .htaccess, takze by tam ani nemusela byt, ne? Zkousel jsem tedy snad veskere alespon mirne smysluplne variace a NIC, stale 404 not found. Je to na pytel.
Proste to neprojde pres Apache chudak Ladenka se ani nedostane ke slovu..
- Šaman
- Člen | 2666
Sorry, ale asi jsme vystříleli všechny nápady kde by ta chyba běžně
mohla být.
Takže budeš muset nejspíš jít od Skeletonu, jestli šlape tak přidat ten
tvůj ContactPresenter a zkusit to postupně ladit.
Celou dobu by ti měla při chybě vyskakovat laděnka – když naskočí bílá chybová stránka tak je to známka toho, že chybu (pravděpodobně) zachytil apač a ne nette ⇒ chyba bude mimo program. A jestli ti bude řvát laděnka, tak sem postni celou zprávu. Bez toho asi není co dál radit.
P.S. Přihoď sem ještě pro jistotu adresářovou strukturu a umístění indexu a bootstrapu.
- simekadam
- Člen | 36
Tak jsme znovu zkousel zoufale prehazovat velikost pismen, ale nic:)
Na obrázku je moje adresářová struktura, měl by to být úplně základní skeleton, co je v Nette defaultně. .htaccess mám přímo v adresáři document_root (jeden je teda ještě v app, s tim jsem nic nedělal, je tam jenom Deny from All), jeho presny obsah je na dalsim obrazku.
Adresarova struktura projektu, Sites je primo root Apache
Obsah .htaccess v document_root
V bootstrapu mám tohle:
<?php
use Nette\Debug,
Nette\Application\Route,
Nette\Environment,
Nette\Application\SimpleRouter,
Nette\Framework,
Nette\Application\Presenter;
require LIBS_DIR . '/Nette/loader.php';
Debug::enable();
Environment::loadConfig();
$session = Environment::getSession();
$session->setSavePath(APP_DIR . '/sessions/');
$application = Environment::getApplication();
//$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;
$router = $application->getRouter();
$router[] = new Route('index.php', array(
'presenter' => 'contact',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>', array(
'presenter' => 'default',
'action' => 'default'
));
//$router[] = new SimpleRouter('Default:default');
$application->run();
?>
Nakonec ještě jistota v podobě mého http://www.ubytovanihavelkovi.cz/…d/httpd.conf
- simekadam
- Člen | 36
Tak jsem zkusil zmenit velikost pismen, nic..Zmenit rewritebase nic..Ale kdyby byla nejak spatne cesta k tem presenterum, tak by to nenaslo ani ten default presenter a default view, ne?
Url ke ktere se snazim pristoupit je http://localhost/…oot/contact/
Vypise 404..Kdyz napisu misto contact default, tak taky 404, pokud necham jenom document_root nacte se default presenter a view..
- simekadam
- Člen | 36
Tak jsem zkusil dat ten presenter default pryc a jediny z ceho jsem byl potesenej, ze mi to zachytila Ladenka, kdyz jsem se pokusil zadat url bez presenteru..ale i kdyz tam s tou upravenou routou bez defaultniho presenteru zadam default za document_root, tak to napise tu moji obligo 404ku..Ale kdyz proste do bootstrapu do rooty zadam jako defaultni presenter ten Contact, tak ho to najde a zobrazi..Ale proste url to nebere smejd, takze to proste je fakt v tom .htaccess nekde
- simekadam
- Člen | 36
at delam s rewritebase co delam, tak nic..Ja doopravdy na 90 % ocekavam potiz s tim htaccess file protection, ale vubec netusim co to je..:)jo a kdyz zadam do adresniho radku index.php, tak se url prepise na default..Mel jsem za to, ze to jde nejdriv pres ten htaccess, ale asi teda ne:)
- Ondřej Brejla
- Člen | 746
File protection
nejspíš zakazuje měnit nastavení skrze
.htaccess
, takže mod_rewrite
nenastavíš…buď to
máš zakázané přímo v httpd.conf
, nebo bych se zkusil podívat
po celé cestě k document_root
u (případně pro jistotu i do
ostatních adresářů), jestli tam někde není nějaký schovaný
.htaccess
, který by to zakazoval.
Editoval Ondřej Brejla (16. 12. 2010 20:29)
- simekadam
- Člen | 36
no to jsem tak nejak myslel..ale jak rikam httpd.conf jsem postoval vyse konkretne
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
modul mam nahranej a v directory pro localhost mam
AllowOverride All
Koukal jsem do adresaru a .htaccess tam proste zadnej neni..navic jinde mi
mode rewrite normalne funguje, jenom tady to nette zlobi. Jedinej dalsi
.htaccess v celym localhostu je par mejch jinejch v jinejch
projektech(fungujou) plus .htaccess v app, kde je
jenom deny from all
- simekadam
- Člen | 36
Zdravím, tak jsem to už vyřešil..Začal jsem se trošku víc hrabat v apachovi a našel jsem tam speciálni user unique httpd.conf, ve kterym bylo mimo jine AllowOverride none..Co mi tedy vrtá hlavou, jak je možný, že jiný .htaccessy na to m stejnym stroji šly:DAle aspoň, že to začalo fungovat..
Takže díky všem za vytrvalou pomoc:)
Nakonec bych měl lehčí dvojnásobnej offtopic, jestli se nebudete
zlobit:)
když mi teda teď už funguje to routování, tak jsem zjistil, že mi to
nenačítá styly..Respektive mám v @layout.phtml nalinkovaný CSSko
s relativní cestou od document_route (css/stylesheet.css)..Jenže když se mi
změní ten presenter (mám v url něco za document_root), tak ten šmejd
začne načítat to css až z „tenPresenter/css/stylesheet.css“ a tam
logicky nic neni. Jak se tohle řeší? Samozřejmě můžu dávat absolutní
cestu, ale to se mi moc nechce, potom bych to musel přepisovat jak
blbeček..
No a druhá část OT..Dá se nějak snadno převést namespacovej projekt na beznamespacovej? Protože na lokálu mám PHP 5.3 a na serveru kam bych to chtěl dát asi zatim nebude..Mám se na to rovnou vykašlat a psát bez namespace, nebo to jde potom nějak ošéfovat??
Toť vše..Znovu díky!!