Vytváření URl bez perzistentních parametrů
- Maekoboss
- Člen | 36
Cus,
potřeboval bych si vygenerovat kanonickou URL na detail článku. V URL přenáším několik perzistentních parametrů jako nastavení filtrů, stránkování atd. Kanonická URL má být samozřejmě čistá url na detail bez všech těch parametrů.
Takže aktuálně mám v NewsPresenteru něco jako tohle.
public function beforeRender() {
parent::beforeRender();
if ($this->post !== null) {
$canonicalURL = $this->link('//detail', array('slug' => $this->post->data->slug));
$this->template->canonicalURL = $canonicalURL;
}
}
Což funguje, ale samozřejmě to do URL přidává aktuální perzistentní parametry. Vím, že se jich dá zbavit nastavením na null, ale to není úplně správný řešení. Protože parametrů je docela dost a navíc by se musel kod upravovat po každém přídání / ubrání parametru.
Ještě by se asi dalo odstřřihnout vše co je za ? v adrese, ale to mi taky nepřijde zrovna správný, protože by v nějakém případě mohlo být žádoucí, aby kanonická adresa obsahovala i nějaké předem specifikované parametry.
Tak jak to řešíte? :)
Díky
- Azathoth
- Člen | 495
Persistentní parametry se předávají jako parametry v url, ve chvíli, kdy je nepředáváš, tak o ně přijdeš. Pokud chceš mít nějaké parametry persistentní, ale ne v url, tak je zkus předávat třeba přes session, ale to nemá v nette tak hezkou podporu jako persistentní parametry.
- Zax
- Člen | 370
Zrovna jsem vstal a káva je ještě příliš horká, takže si teď nejsem jistý, nakolik ti to pomůže (já tím řeším trošku jiný use-case, kdy mi v různě zanořených komponentách zůstávají nepotřebné parametry, které v určitých situacích vyhazují errory), ale já používám takové malé kouzlo s array_merge:
protected $defaultLinkParams = [
// zde si navolíš výchozí parametry
'page' => 0,
'filters' => []
];
public function link($destination, $args = []) {
return parent::link($destination, array_merge($this->defaultLinkParams, $args));
}
Když si parametr při vytváření odkazu předáš, tak se do adresy vloží, jinak se použije hodnota v $defaultLinkParams (pokud je stejná jako defaultní, tak z adresy zmizí). Pokud parametr v $defaultLinkParams není, tak se na něj aplikuje výchozí chování.
Editoval Zax (12. 10. 2014 14:29)
- Jan Tvrdík
- Nette guru | 2595
Je také možné pro generování odkaz nepoužít metodu
Presenter::link
, ale ručně zavolat
IRouter::constructUrl
. Případně je možné použít také
knihovnu Nextras\LinkFactory