SEO odkazy – problém při redirect(‚this‘)
- motorcb
- Člen | 552
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
- motorcb
- Člen | 552
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');
- pepakriz
- Člen | 246
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#…).
- pepakriz
- Člen | 246
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.