Vytváření URl bez perzistentních parametrů

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

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

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

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)

Maekoboss
Člen | 36
+
0
-

Úplně mimo. U kanonické url my jsou parametry k ničemu, pokud nejsou nutné pro chod celé aplikace.

Maekoboss
Člen | 36
+
0
-

Ještě se na tohle řešení podívám. Možná to k něčemu bude.

duke
Člen | 650
+
0
-

Řešil bych to tím nulováním s tím, že bych se pokusil napsat metodu, která mi automaticky zjistí, které všechny parametry je třeba nulovat (abych to, jak říkáš, nemusel ručně upravovat po každém přídání / ubrání parametru).

Jan Tvrdík
Nette guru | 2595
+
0
-

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