Nedokážu se odrazit dál se Skeletonem a Routama

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

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

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

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

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

Hissun: Kde to hlásí to „Object not found“? Nesetkal jsem se s tím, můžeš poslat screenshot? :)

Hissun
Člen | 9
+
0
-

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

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

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)

dotTwelve
Člen | 167
+
0
-

Zkus v souboru bootstrap.php zmenit

<?php
Debug::enable();
?>

na

<?php
Debug::enable(Debug::DEVELOPMENT);
?>

jestli se ti chyti Ladenka, muzes sem hodit chybu.

vlki
Člen | 218
+
0
-

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 NoneAllowOverride All. Viz třeba tenhle příspěvek .

Hissun
Člen | 9
+
0
-

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ě?

vlki
Člen | 218
+
0
-

Pozitivní, že jsme našli jádro pudla:)

Četl jsi už část dokumentace o routách ?
Tam je to vysvětleno moc pěkně.

kravčo
Člen | 721
+
0
-

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.