SEO odkazy – problém při redirect(‚this‘)

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

Zdravím.
Hraju si s routováním (SEO) a různýma akcema (přidání nového zboží, přidání komentáře ke zboří, update zboží).
Chci mít hezké SEO odkazy:
/shop/kategorie/id-zbozi/nazev-zbozi

Proto jsem do bootstrap.php přidal:

$container->router[] = new Route('shop/[<category>]/[<id [0-9]+>]/[<name>]', 'Shop:detail');

Statické odkazy pro jednoduchost:

<a href="{plink Shop:detail, category => 'vodni-sporty', id => '1', name => 'plavky' }">plavky</a><br/>
<a href="{plink Shop:detail, category => 'fotbal', id => '2', name => 'kopacky' }">kopačky</a><br/>
<a href="{plink Shop:detail, category => 'hokej', id => '3', name => 'hokejka' }">hokejka</a><br/>

To mi udělá krásné odkazy – super :)
Jenže teď nastává problém při přesměrování (například při editaci zboží, přidání komentáře ke zboží):

$this->presenter->redirect('this');

To pak je adresa předělána na klasickou: shop/detail/id

Otázka zní: nevěděl by někdo jak zachovat stále hezkou SEO adresu při zavolání funkce redirect(‚this‘);??

Děkuji za každou radu

Felix
Nette Core | 1196
+
0
-

Zkus pouzit:

$container->router[] = new Route('shop/[!<category>]/[!<id [0-9]+>]/[!<name>]', 'Shop:detail');
motorcb
Člen | 552
+
0
-

Felix:
nepomohlo… stále přesměrovává na shop/detail/1/

jtousek
Člen | 951
+
0
-

Ukaž všechny routy (kvůli pořadí).

motorcb
Člen | 552
+
0
-

jtousek:

// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
//$container->router[] = new Route('shop/[<category>]/[<id [0-9]+>]/[<name>]', 'Shop:detail');
$container->router[] = new Route('shop/[!<category>]/[!<id [0-9]+>]/[!<name>]', 'Shop:detail');
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
Felix
Nette Core | 1196
+
0
-

Jeste me napada moznost.

$this->presenter->redirect('this', $this->getParams());

EDIT:

$this->presenter->redirect('this', $this->getParameter());

Editoval Felix (20. 6. 2012 17:32)

pepakriz
Člen | 246
+
0
-

Máš všechny parametry které se přenášejí v routě persistentní?

motorcb
Člen | 552
+
0
-

Felix:
Nefunguje: Call to undefined method ShopPresenter::getParams()

pepakriz:
prosim?

jtousek
Člen | 951
+
0
-

A takhle?

$this->presenter->redirect('this', $this->params);
motorcb
Člen | 552
+
0
-

jtousek:
To už něco dělá :) Odkazuje to na /shop/detail/2/?do=redirectThis
ale skončí chybou:
Tato stránka obsahuje smyčku přesměrování

jtousek
Člen | 951
+
0
-

Hups :-D

pepakriz
Člen | 246
+
0
-

Tvá routa vyžaduje parametry category, name a id. Proto když je tam pošleš ručně, routa se vytvoří správně. Pokuď chceš, aby se tyto parametry posílaly automaticky, označ je jako persistentní (viz https://doc.nette.org/…n/presenters#…).

motorcb
Člen | 552
+
0
-

pepakriz:
Z toho nejsem příliš moudrý, nebylo by nějaké bližší vysvětlení?

pepakriz
Člen | 246
+
0
-

Nejdřív vyzkoušej, jestli neplácám blbosti. Ale mělo by to fungovat asi takhle. Tvá routa ve svém tvaru přenáší parametry category, name a id. Takže když chceš, aby tato routa tvůj požadavek zachytila, musí tyto parametry obdržet. Proto ti tato konctrukce funguje správně:

$this->link('Shop:detail', array(category => 'vodni-sporty', id => '1', name => 'plavky'));

Předáváš v ní totiž všechny parametry, které routa potřebuje. Když se ale pokusíš vytvořit odkaz takto:

$this->link('this');

, nepřenesou se parametry žádné, je to defakto jako bys napsal:

$this->link('this', array());

Takže ty parametry musíš vždy v druhém argumentu uvádět. Uznávám, že je to opruz a proto Nette nabízí takovou pěknou věc a tou jsou persistentní parametry. Když v presenteru oannotuješ category, name a id persistentní annotací, budou se automaticky při vytváření odkazů předávat.