Problem s odkazy, zrejme elemetarni nevedomost

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

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
+
0
-

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 | 2635
+
0
-

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
+
0
-

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 | 2635
+
0
-

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
+
0
-

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.

OK3
Člen | 91
+
0
-

Máš v pořádku .htaccess? Někdy je potřeba přidat/přepsat direktiva RewriteBase. Na lokále bývá obvykle „/“ něco jinýho než kořen projektu..

simekadam
Člen | 36
+
0
-

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
+
0
-

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

smasty
Člen | 90
+
0
-

Skús v .htaccess (ten, ktorý je v document_root) nastaviť RewriteBase AgenturaSport/document_root/ vyzerá to ako problém s rewritovaním, nie ako problém Rout/Nette…

simekadam
Člen | 36
+
0
-

Stale to pise 404 not found..Asi to fakt bude neco s tim .htaccess file protection, ale fakt netusim, jak to spravit.

simekadam
Člen | 36
+
0
-

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
+
0
-

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
+
0
-

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 | 2635
+
0
-

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.

jasir
Člen | 746
+
0
-

Ještě si překontroluj málá/velká písmenka (contact vs. Contact, default vs Default)

simekadam
Člen | 36
+
0
-

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

redhead
Člen | 1313
+
0
-

složky šablon presenterů v app/templates/ musí začínat na velké písmeno (app/template/Contact, app/template/Default)

kravčo
Člen | 721
+
0
-

Nemá byť RewriteBase absolútne?

RewriteBase /AgenturaSport/document_root/
simekadam
Člen | 36
+
0
-

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..

Šaman
Člen | 2635
+
0
-

Změň ještě routu tak, aby nebyl default presenter defaultní a pak zkus zadat adresu /default

simekadam
Člen | 36
+
0
-

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

natrim
Člen | 73
+
0
-

tu RewriteBase mas furt spatne, ma bejt: RewriteBase /AgenturaSport/document_root/

simekadam
Člen | 36
+
0
-

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
+
0
-

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_rootu (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
+
0
-

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

natrim
Člen | 73
+
0
-

Můžeš někam hodit v zipu, ten projekt kterej nefunguje? Jestli půjde u někoho jinyho tak je problem v nastaveni tveho localhost serveru, a jestli ne tak na něco přijdeme.

simekadam
Člen | 36
+
0
-

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!!

colek
Člen | 59
+
0
-

ad layout – v šabloně je dostupná proměnná {$basePath}

ad php – osobně to řeším zakomentávním kusů kodu… resp. projekty na php 5.3 hostuju jinde :)