Hledání + stránkování + komponenta oblíbená = 2 * do

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Jak byste řešili následující? V podstatě potřebuji provést v 1 url handle v presenteru i handle v komponentě.

  1. Vyhledání výsledků + stránkování vyžaduje přenášení submitu, proto používám „persistentní“ handle (?do), které toto umožňuje. To je ještě ok.
  2. U každého výsledku mám komponentu {control favour $id} k přidání záznamu mezi oblíbené. Tu nastává problém, jelikož využívá druhé handle, které přepisuje první, tedy maže výsledky.

Napadá mne 1. ukládat nějako do session, ale nevím, jestli je to vhodné.


Edit: Tak už jsem to vyřešil pomocnou funkcí, kterou volám po provedení handle komponenty. Nicméně i tak by mne zajímalo, jak na to čistě a jednoduše.

Editoval Schmutzka (12. 6. 2012 21:02)

Filip Procházka
Moderator | 4668
+
0
-

Čistě a jednoduše bych se nespoléhal na handle, ten signalizuje pouze to, že se změnily parametry. Tedy mít nějaké parametry v url (persistentní v komponentě/presenteru) a číst ty. Handle se má volat vždy pouze jednou – když měníš stav presenteru. Né pokaždé!

Tharos
Člen | 1030
+
0
-

Tak tak, parametr do by neměl být součástí popisu stavu aplikace. Doporučuji po každém signálu uživatele přesměrovat na stránku bez parametru do v URL podobně, jako se přesměrovává v patternu Post-Redirect-Get u formulářů. Pak Ti potřeba „vícenásobného do“ přirozeně úplně odpadne.

Tomáš Votruba
Moderator | 1114
+
0
-

Díky oběma za podněty. Přes persistentní parametry jsem to měl původně, ale nepodařilo se mi použít VisualPaginator tak, aby mi je zachoval. Navíc mi nepřijde dobré mít url 300 znaků dlouhou.

Handle by se tedy nikde v url nemělo viset, jestli tomu rozumím.

@Tharos: Jestli to chápu dobře, tak např. takto změním stránkování?

/** @persistent array */
public $searchValues;

/** @persistent int */
public $from;


public function handleChangePage($searchValues, $from = 0)
{
	// změním stránkování ...

	$this->redirect("this", array(
		"from" => $from,
		"searchValues" => $searchValues // pole s parametry hledání
	));
}
llook
Člen | 407
+
0
-

V tomhle případě by ti měl stačit $this->redirect('this'), perzistentní parametry se nastaví samy:

/** @persistent array */
public $searchValues;

/** @persistent int */
public $from;


public function handleChangePage()
{
        // změním stránkování ...

        $this->redirect("this");
}
Tomáš Votruba
Moderator | 1114
+
0
-

Díky všem, už to běží.