Cool URL zjevně nefunguje; volání metody z presenteru v šabloně

b4utz3n
Člen | 4
+
0
-

Dobrý den,
mám dvě otázky.

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

  1. 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 | 762
+
0
-

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

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

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

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

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

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 | 762
+
-1
-

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

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;