Nefunkční persistenty v 0.9.5

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

Mám šablonu např. objednávky v presenteru OrderPresenter, ten má persistenty id a filter.

V této šabloně mám takovýto odkaz

<?php

<a href="{plink Product:edit, id => $item->product->id}" target="_blank">{$item->name}</a>

?>

presenter ProductPresenter má také persistenty id a filter, mají sice stejného předka BasePresenter nicméně v tom nejsou persistenty nastaveny!

přesto se mi přenese i filter, což způsobuje nemalé problémy, protože není kompatibilní, kde je chyba?

kde hledat chybu?

díky za rady

přenos persistentů mezi dvěma různými presentery, bug or feature?

Editoval mcmatak (9. 9. 2010 20:18)

Ondřej Mirtes
Člen | 1536
+
0
-

Tohle jsme nedávno s Davidem řešili a Nette pozná, jestli jsou parametry definované z jednoho předka nebo v každém presenteru zvlášť. V prvním případě se přenášejí, ve druhém ne. Hledal bych tedy chybu ve tvém kódu.

mcmatak
Člen | 504
+
0
-

a seš si jist, že to nette pozná i ve verzi 0.9.5?

mcmatak
Člen | 504
+
0
-

ááá pozor asi máš pravdu, tohle jsem si neuvědomil, na vině asi bude tato fce

<?php
	public function saveState(array &$params)
	{

		$this->filter = $this->getRestriction()->toGet();

		parent::saveState($params);
	}
?>

filter sice opravdu využivaji oba presentery, ale rozhodně nechci aby se to přenášelo, byl by nějaký easy fix?

mcmatak
Člen | 504
+
0
-

ze by změna saveState, takže chybělo asi předávat reflection, řešení:

<?php

	public function saveState(array &$params, $reflection = NULL)
	{

		parent::saveState($params, $reflection);

		if (array_key_exists("filter", $params)) {
			$params['filter'] = $this->getRestriction()->toGet();
		}

	}

?>
mcmatak
Člen | 504
+
0
-

Tak snad ještě jednou a naposledy,

co potřebuji od fce saveState, složení jednoho persistentu je komplikované, tedy dochází base encode, gzip, a dalším string fcím které nějak tu proměnnou vygenerují, nelze to proto dělat pokaždé, když se změní jakýkoli parametr který má vliv na složení toho persistentu, proto to odkládám až na dobu kdy někdo potřebuje ten persistent, tedy saveState,

ovšem jak to udělat, když někdo ten persistent chce vnutit?

->link(Nekam, filter ⇒ silenost)

v takovem pripade nechci prepisovat ten filtr a chci ho pri tom nechat, ale jak to udelat?