Nedokážu se odrazit dál se Skeletonem a Routama
- Hissun
- Člen | 9
Zdravím
začínám a nějak jsem se zasekl už na počátku. Projel jsem úspěšně celý začátek ala tvorba DataGridu. Presentery a patřičné šablony dejme tomu že základně chápu.
Stavím teď aplikaci od vzorového Skeletonu a poprvé jsem se tak setkal s Routama, které tam v defaultu jsou. Nedokážu přitom nejjednoduší věc – odkaz (snažím se vymyslet jak separovat hlavní menu od obsahu). Skeleton přitom sám o sobě funguje správně, vypisuje „it works“
v default.phtml jsem přidal následující odkazy:
a)
<a href="{plink Pokus}">Link</a>
-- vytvořeny PokusPresenter /app/presenters a
/app/templates/Pokus/default.phtml
URL: http://localhost/…epage/pokus/
b)
<a href="{plink Homepage::link}">Link2</a>
-- v HomepagePresenter vytvořena metoda
public function renderLink()
{
$this->template->title = 'Link!';
}
URL: http://localhost/…mepage/link/
nefunguje mi ani jeden odkaz, vždy „object not found“.
připomínám – ať není nutné hledat – že v Skeletonu jsou routy takto:
<?php
$router[] = new Route('index.php', array(
'presenter' => 'Homepage',
'view' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<view>/<id>', array(
'presenter' => 'Homepage',
'view' => 'default',
'id' => NULL,
));
?>
Chápu, že veškeré odkazy generované přes plink směřují na Homepage presenter, proto se tam v prvním odkazu homepage objevuje, ale nedokážu s tím nijak dál pohnout, i přes několikaré přečtení dokumentace o Routování a hledání na foru. Když tento kód routování z bootstrapu.php odstraním, tak to nejede vůbec.
otázka
- jak to tedy zprovoznit, aby odkazy na nějaký jiný Presenter nebo jinou metodu než fungovali? Předem děkuji za odpovědi
Editoval Hissun (23. 6. 2009 19:11)
- Honza Marek
- Člen | 1664
Moc se v tom textu nevyznám, jelikož není zrovna moc dobře formátovaný a nechce se mi to luštit. Ale čeho jsem si všimnul je toto:
{plink Homepage::link} → {plink Homepage:link}
- Ondřej Mirtes
- Člen | 1536
Tady by taky měla být dvojtečka:
<a href="{plink Pokus:}">Link</a>
A ještě v routách by se mělo přepsat view na action (je to break zpětné kompatibility se stabilní verzí 0.8):
<?php
$router[] = new Route('index.php', array(
'presenter' => 'Homepage',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
?>
A dědíš PokusPresenter od Presenteru? Jinak už mě žádná chyba nenapadá.
- Hissun
- Člen | 9
Dvojtečky jsem dal do tvaru jak bylo doporučováno. Link na sebe samotného mi tím pádem funguje. Tohle tedy normálně zobrazuje co má.
<a href="{plink Homepage:}">Link2</a>
Co mne o to více překvapila byla chyba, když jsem pro jistotu updatoval nette na stable verzi, nebyl jsem si jist co vlastně používám. Po změně bootstrapu.php z view na action jak doporučil LastHunter se vše vyřešilo, díky.
Druhý odkaz stále nic. Je to trochu jinak než předtím, ale to je jedno.
<a href="{plink Pokus:link}">Link</a>
URL:
http://localhost/mojeapp/pokus-nette/document_root/pokus/link/
Kódy prezenterů (liší se jen v řetězcích)
<?php
class PokusPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->title = 'PokusPresenter - default!';
}
public function renderLink()
{
$this->template->title = 'Pokus - Link!';
}
}
?>
existují šablony jak templates/Pokus/default.phtml a link.phtml tak shodné pro Homepage.
Přesto stále Object not found.
Protože je URL už tak jaksi logičtější, tak vážně netuším jestli mám problém někde na úrovni Presenter-Templates nebo je to stále vliv Routování. Vidíte to tam náhodou někde?
V routování se budu muset chvilku nějak povrtat sám, je mi jasné že bez routování to nepojede (neboť nemám vše na Default.default) a s ním zase to musí být nějak jinak aby vše nebylo přesměrováno na Homepage.
- Ondřej Mirtes
- Člen | 1536
Hissun: Kde to hlásí to „Object not found“? Nesetkal jsem se s tím, můžeš poslat screenshot? :)
- Hissun
- Člen | 9
no při kliknutí na odkaz Link. Domnívám se, že při téhle defaultní definici rout bude vše v přesměrováno ma presenter Homepage a metodu renderDefault(). Odkaz ale funguje jen při tom
<a href="{plink Homepage:}">Link2</a>
Tyhle dvě nic nedělají:
<a href="{plink Pokus:link}">Link</a>
<a href="{plink Homepage:link}">Link3</a>
Je to klasická http error 404, jako kdybych neměl vůbec napsaný daný presenter nebo šablonu nebo špatné cesty (jak to je jsem popsal výše, nicméně testuju na xamppu ve windows, takže je to i teď v důsledku jedno). Domnívám se ale, že můj problém je v těch routech, protože Datagrid tutorial, který je bez rout, jsem projel celý a funguje. Přitom moc kódu k tomu v Skeletonu jsem nenapsal (uvedl jsem vše).
Editoval Hissun (24. 6. 2009 8:50)
- vlki
- Člen | 218
LastHunter radí dobře. Je potřeba nějaká přesnější specifikace vyhozované výjimky.
Ona je to totiž pravda, že Laděnka je pravá ruka Nette programátora:) Co
se ti tedy vyhazuje za výjimku? Je to opravdu Object not found
nebo BadRequestException
?
Takže buď pošli screenshot nebo nejlépe zapakovanou celou část aplikace, která ti nejede:)
- Hissun
- Člen | 9
Nevyhazuje to výjimku – ve smysli Nette exceptions. Prostě je jen odkaz nedostupný, apache vyhodí error 404. Laděnka se vůbec neobjevuje.
aplikace je na http://www.easy-share.com/…9552/app.zip Všechen kód navíc jsem popsal výše, jinak jde pouze o skeleton example plus aktuální plus 0.8 stable nette
jde jenom o ty první dva linky, odkazy uvnitř seznamu ani nečekám že budou fungovat.
Editoval Hissun (24. 6. 2009 10:21)
- vlki
- Člen | 218
Stáhl jsem to a funguje. Na stable i devel verzi Nette.
Takže bych v tvém případě viděl spíš problém v
.htaccess
. Předpokládám, že i tobě se linky vygenerují
dobře, nebo ne?
Pokud je to špatným nastavením .htaccess
, tak to už se tu na
fóru řešilo mockrát. Pohledej.
Říkal jsi, že používáš XAMPP. Nějakou novou verzi? Ve starých bylo potřeba odkomentovat načtení modulu mod_rewrite
V těch novějších se už, myslím, načítá automaticky, ale je potřeba
nastavit, aby šlo výchozí pravidla přebít. Takže změny v
AllowOverride None
→ AllowOverride All
. Viz třeba
tenhle příspěvek .
- Hissun
- Člen | 9
Díky moc, bylo to v tom nastavení xamppu, to mne nenapadlo hledat.
Ještě takovej jeden dotaz – co přesně dělá ta druhá routa? Měl
jsem za to, že veškeré požadavky přesměruje na Homepage a default. Jinými
slovy, jaktože funguje ten
<a href="{plink Pokus:link}">Link</a>
neboli URL
document_root/pokus/link/ :) Vede na správnou metodu správného presenteru,
ale jak to? Co jsem na routách pochopil špatně?
- kravčo
- Člen | 721
Hissun napsal(a):
Díky moc, bylo to v tom nastavení xamppu, to mne nenapadlo hledat.
Ještě takovej jeden dotaz – co přesně dělá ta druhá routa? Měl jsem za to, že veškeré požadavky přesměruje na Homepage a default. Jinými slovy, jaktože funguje ten
<a href="{plink Pokus:link}">Link</a>
neboli URL document_root/pokus/link/ :) Vede na správnou metodu správného presenteru, ale jak to? Co jsem na routách pochopil špatně?
Druhá routa má v nastavení predvolené hodnoty
parametrov. To znamená, že routa berie URL a podľa tvaru
presenter/action/id
presmeruje na správny prezenter a metódu
(s prípadnými parametrami). V prípade, že niektorá časť chýba
(napríklad action+id), použijú sa hodnoty z nastavenia routy.