Persistentní parametry
- soundake
- Člen | 24
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
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.
- Ondřej Mirtes
- Člen | 1536
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
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
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
- Ola
- Člen | 385
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
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
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 :) )
- tom
- Člen | 171
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
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
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
aha, tak uz nic
resil jsem to dost dlouho, ale az ted, kdyz se zeptam, najdu tenhle prispevek
nevadi ;)