Cool URL zjevně nefunguje; volání metody z presenteru v šabloně
- b4utz3n
- Člen | 4
Dobrý den,
mám dvě otázky.
- Chci používat cool url, bohužel zjevně nefungují.
Mám následující kód v šabloně:
{var $router_args = ["item_id" => 1, "item_name" => "nejaky-text-x-y-z"]}
<a n:href="MujPresenter:default (expand)$router_args">
{$promenna->nazev}
</a>
A router:
$router->addRoute('stranka/<item_id>-<item_name>', "MujPresenter:default");
URL by měla vypadat takto:
localhost/projekt/www/stranka/1-nejaky-text-x-y-z
Místo toho ale dostávám toto:
localhost/projekt/www/stranka/?item_id=1&item_name=nejaky-text-x-y-z
Jak docílit toho, abych dostal první odkaz, namísto toho druhého?
- Potřebuji zavolat metodu z presenteru v šabloně, bohužel se mi to nedaří.
Při použití:
{mojeMetoda($promenna)}
mi vyskočí chyba „Call to undefined function
mojeMetoda()“
Stejně tak jako při použití následujícího:
{$this->mojeMetoda($promenna)}
Díky moc za odpovědi a rady.
- Kamil Valenta
- Člen | 822
Myslím, že není zřejmé, co je ještě id a co už name
id = 1, name = nejaky-text-x-y-z ?
id = 1-nejaky, name = text-x-y-z ?
id = 1-nejaky-text, name = x-y-z ?
…
První bych id omezil na číselné hodnoty.
$router->addRoute('stranka/<item_id \d+>-<item_name>', "MujPresenter:default");
{$presenter->mojeMetoda($promenna)}
Editoval kamil_v (16. 5. 2020 21:52)
- b4utz3n
- Člen | 4
Díky moc za radu v bodu č.2!!
Všiml jsem si teď něčeho jiného..
URL má vypadat takto:
localhost/projekt/www/stranka/1-nejaky-text-x-y-z
Ale místo toho vypadá takto:
localhost/projekt/www/muj-presenter/?item_id=1&item_name=nejaky-text-x-y-z
Pokud zadám do prohlížeče přímo první odkaz, automaticky mě to
přesměruje na
localhost/projekt/www/muj-presenter/?item_id=1&item_name=nejaky-text-x-y-z
Nevím, proč se to přepíše na muj-presenter..
Editoval b4utz3n (16. 5. 2020 22:11)
- joe
- Člen | 313
A co když vyzkoušíš
{var $router_args = ["item_id" => 1, "item_name" => "nejaky_text_x_y_z"]}
<a n:href="MujPresenter:default (expand)$router_args">
{$promenna->nazev}
</a>
Tak to funguje?
Na podobné adresy používám router jen
$router->addRoute('stranka/<id>', "MujPresenter:default");
a pomocí globálních filtrů si převedu toto id
na
entitu.
https://petrjirasek.cz/…lani-v-nette
Zjednoduší se tak o vytváření odkazů a přijde mi to hezčí psát v šablonách
<a n:href="MujPresenter: $entita">
{$entita->nazev}
</a>
Editoval joe (17. 5. 2020 16:29)
- Kamil Valenta
- Člen | 822
A nechytá tě to nějaká jiná dřívější routa? Nemáš této konkrétní routě předřazenu nějakou obecnější?
- b4utz3n
- Člen | 4
Ani jedno nefunguje. Teď jsem zjistil, že to dělá routa pro homepage – dle tracy je aktivní a podle zápisu to i dává smysl.
$router->addRoute('[<locale=cs cs|sk>/]<presenter>/<action>', 'Homepage:default');
Změnil jsem jí tedy na:
$router->addRoute('[<locale=cs cs|sk>/]', 'Homepage:default');
A vše funguje, akorát nastal problém, že teď mi to na té stránce
píše toto (po kliknutí na odkaz, který už funguje tak, jak má a má cool
URL)
Invalid link: No route for MujPresenter:default(locale=cs) search► skip error►
Chci se ještě bokem zeptat. Jde nějak v Nette napsat, abych měl u všech rout
[<locale=cs cs|sk>/]
? A nebo to musím manuálně dopsat ke všem?
Editoval b4utz3n (20. 5. 2020 12:29)
- b4utz3n
- Člen | 4
Tak ten prblém s tou routou jsem vyřešil. Poslední otázka tedy je, jestli jde nějak nastavit, aby všechny routy měli defaultně na začátku <locale=cs cs, nebo jestli to musím psát u všech ručně.
Editoval b4utz3n (20. 5. 2020 12:44)
- Kamil Valenta
- Člen | 822
Můžeš si podědit router a napsat metodu ve smyslu
public function addMyRoute($route, $def) {
return $this->addRoute('[<locale=cs cs|sk>/]'.$route, $def);
}
Nebo, pokud to potřebuješ zadrátovat do mnoha již existujících routerů, přepsat přímo metodu addRoute()…
- ForestCZE
- Člen | 209
b4utz3n napsal(a):
Tak ten prblém s tou routou jsem vyřešil. Poslední otázka tedy je, jestli jde nějak nastavit, aby všechny routy měli defaultně na začátku <locale=cs cs, nebo jestli to musím psát u všech ručně.
A co třeba
/** @persistent */
public $locale;