Persistentní parametry

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

Přátelé, velmi se tu trápíp s těmi persistentními parametry a dostávám pocit, že to vůbec nefunguje :(

Zkoušel jsem projít i pár příkladů, ale žádný z nich nezabral. Do URI se daný parametr při použití mětody link nepřidá. Podařilo se mi to jednou, kdy se přidal po smazání šablon z TEMP. Ale podruhé už se ovšem také nepřidal.

Možná je chyba někde v nastavení PHP či samotné aplikace, ale jedu podle příkladů z distribuce.

Dokáže někdo poradit? Nebo napsat dokumentaci k Nette\Presenter a třídám souvisejícím?

Díky moc!

David Grudl
Nette Core | 8172
+
0
-

Persistentní parametry se používají prakticky jen v příkladu fifteen. Podmínkou persistence je jeho deklarace jako public a uvedení řetězce @persistent v phpDoc.

	/** @persistent int */
	public $round = 0;

Uvedný parameter pak není potřeba uvádět při volání link(...), neboť se předává automaticky. Ale uvést ho samozřejmě možné je a tak mu změnit hodnotu.

soundake
Člen | 24
+
0
-

Tak nakonec se to vyřešilo tuhle. Může za to eAccelerator. Když jsem ho vypnul, persistentní parametry začaly fungovat. Supr :)

Prochaine
Člen | 15
+
0
-

Dneska mě to také trošku potrápilo. Furt jsem nemohl přijít na to, proč jedna proměnná je automaticky persistentní a druhá nikoliv… a vůbec mě nenapadlo, že ten komentář musí být těsně nad každou tuto proměnnou. Budu muset vzít tu dokumentaci z gruntu.

Ondřej Mirtes
Člen | 1536
+
0
-

Můžete uvést několik příkladů, kdy bych v praxi mohl využít persistentní parametry? Napadá mě třeba jen e-shop, kdy je víc úrovní vnoření a tak místo volání renderView s více parametry (category, subcategory, item) definuji tato jednotlivá view v rámci jednoho presenteru a jemu dám category jako persistentní. Ale to je asi dost okrajová záležitost… Pak mě napadají ještě jazykové mutace, kdy dostane lang jako persistentní už přímo BasePresenter.

BTW: Jak řeší router, pokud by se v presenteru objevil stejný název persistentní proměnné a názvu parametru v renderView? V routeru to má stejný zápis, <varname>, ne?

Editoval LastHunter (27. 2. 2009 2:17)

Jod
Člen | 701
+
0
-

Pozri si Akrabat.form, alebo Akrabat.old z examples distribúcie.
Je tam perzistentný backlink. Alebo DataGrid z quick start, je tam perzistetná stránka a radenie. Aj pre jazyk v adrese používam perzistetný parameter, a tak ďalej.
Keď má perzistetntný parameter ronaký názov ako parameter metódy akcie, perzistetný parameter sa nastaví podľa hodnoty parametra.

Editoval Jod (27. 2. 2009 8:57)

Ola
Člen | 385
+
0
-

A jéžiš, už jsme zase u koukni se na příklad akrabat z distribuce :)

Persistentní parametry se mi těď hodně hodili, dělám takový MFAčko, rozčleněný na víc sekcí [subdomén], a subdoména je u mě persistentní parametr.. tudíž ji nemusím neustále uvádět když linkuji třeba na články z daný podsekce

Jod
Člen | 701
+
0
-

Dobrý nápad, som si myslel, že subdomény netreba uvádzať v parametri. Ono sa to prevedie na www pokiaľ to neuvedieš, či ako?

Nevie to náhodou aj Akrabat.forms, alebo Akrabat.old z examples v distribúcii, že by som to mrkol?

Ola
Člen | 385
+
0
-

Já to mam udělaný takhle: mám routu ve tvaru //<subdomain subdomena1|subdomena2|subdomena3>.example.com/<page> (která je buď směrovaná na hlavní index nebo má vlastní index.php + .htaccess), pak mam presenter View, jehož default action má parametr $url a persistentní parametr $subdomain, pak, když sem na nějaký subdoméně a chci zpět na index tak odkážu nějak takhle: {plink View: array(‚subdomain‘ ⇒ NULL)} (mam ještě jednu routu ve tvaru //example.com/<page> pro kterou platí že subdomain = NULL).

www. mam pak ošetřený přes .htaccess, že to přesměruje na variantu bez www.

Editoval Ola (27. 2. 2009 9:37)

Jod
Člen | 701
+
0
-

No veď mňa to o chvíľu tiež čaká, uvidím koľko sa natom natrápim. Len miesto vlastného indexu plánujem zmeniť len config.ini na domain.ini a každá doména, či subdoména bude mať rovnaké zdrojáky, len templaty budú rozdielne (asi by mal byť aj temp, možno log a pod.). Myslím, že parameter subdomain neni v action treba, keď je perzistentný.

Ola
Člen | 385
+
0
-

Jod napsal(a):

No veď mňa to o chvíľu tiež čaká, uvidím koľko sa natom natrápim. Len miesto vlastného indexu plánujem zmeniť len config.ini na domain.ini a každá doména, či subdoména bude mať rovnaké zdrojáky, len templaty budú rozdielne (asi by mal byť aj temp, možno log a pod.). Myslím, že parameter subdomain neni v action treba, keď je perzistentný.

V mym případě jo, protože pak ještě nastavuju $this->setView($subdomain); (to by šlo nahradit přes $this->getParam, ale to už je jedno :) )

Jod
Člen | 701
+
0
-

a $this->setView($this->subdomain); ? Ale prehladnejšia je tá tvoja alternatíva :)

Editoval Jod (27. 2. 2009 10:31)

tom
Člen | 171
+
0
-

Jakým způsobem se dají ty persistentní parametry v URL skrýt?

mám URL

http://localhost/pokus.cz/5?menu-active=2&menu-thread[0]=2&menu-thread[1]=5&menu-id=5

a rád bych ji měl ve tvaru

http://localhost/pokus.cz/5

pokud je to možné :)

Zkouším to pomocí

<?php
$router[] = new Route('<id> ? menu-id=<[0-9]*> & menu-active=<[0-9]*>', ...
?>

ale nedaří se … chci se zeptat jdu na to správně? Nebo jsem úplně vedle? :) Dík

romansklenar
Člen | 655
+
0
-

Persistentní parametry nejsou určeny k tomu co popisuješ. Toho co ty zamýšlíš lze dosáhnout úpravou metod loadState() a saveState() v presenteru nebo controlu, tak aby si držel své persistentní parametry v session, v případě controlu možná rovnou celou komponentu. Ukázkový příklad fifteen v distribuci může posloužit jako inspirace.

redhead
Člen | 1313
+
0
-

Zdravim,

testuju ted hosting klenot.cz a tam nejdou persistentni parametry, zrejme kvuli tomu eAcceleratoru.
Zkousel jsem teda prepsat metodu getPersistentParams() v PresenterHelpers jak navrhoval David tady

Ale i kdyz to funguje, nevim jesli je to spravne, protoze sem zrusil tu callback funkci (jesli to nema nejakej dalsi vliv na neco):

<?php
	public static function getPersistentParams($class)
	{
		$params = & self::$ppCache[$class];
		if ($params !== NULL) return $params;
		$params = array();
		if (is_subclass_of($class, 'PresenterComponent')) {
			// $class::getPersistentParams() in PHP 5.3
			$defaults = get_class_vars($class);
			//misto $default bylo call_user_func(array($class, 'getPersistentParams'), $class) :
			foreach ($defaults as $name => $meta) {
				//if (is_string($meta)) $name = $meta;
				//persistentni parametry zacinajici na p_
                		if(substr($name, 0, 2) !== 'p_') continue;
					$params[$name] = array(
						'def' => $defaults[$name],
						'since' => $class,
					);
			}
			$params = self::getPersistentParams(get_parent_class($class)) + $params;
		}
		return $params;
	}
?>

Zrusil jsem ji protoze to vracelo nejak pokazene to pole.

Takhle to vraci spravne…

Dik

Editoval redhead (7. 5. 2009 23:03)

redhead
Člen | 1313
+
0
-

aha, tak uz nic

resil jsem to dost dlouho, ale az ted, kdyz se zeptam, najdu tenhle prispevek

nevadi ;)