Persistentní komponenty – dokumentace
- Yrwein
- Člen | 45
Zdravím. .) Existuje na téma persistentních komponent nějaká
dokumentace? (Nedávno jsem při datlení narazil na metodu
getPersistentComponents, což pro mě bylo docela překvápko.) Aneb jak
fungují, co se s nima dá a nedá provádět, nějaký reálný příklad atd?
Z fóra jsem zatím vyčetl jen to, že fungují spíš jako schránka pro
jiné persistentní parametry označení, že v komponentě jsou
persistentní parametry. (Pokud jsem to pochopil správně.)
Editoval Yrwein (9. 6. 2010 11:12)
- Mikulas Dite
- Člen | 756
O tom sem nikdy neslyšel – co by to mělo dělat? Serializovat instance komponent nebo něco podobného? Skoro jistě jde jenom o to, že komponenta přistupuje k persistentím parametrům.
- Tharos
- Člen | 1030
Funguje to tak, že je-li nějaká komponenta označená jako persistentní, automaticky se mezi requesty přenášejí její persistentní parametry. Ono takto lze mezi jednotlivými requesty automaticky přenášet „stav komponenty“, protože ten je většinou definován právě množinou nějakých parametrů komponenty a jejich aktuálních hodnot.
Editoval Tharos (9. 6. 2010 13:15)
- o5
- Člen | 416
Tharos napsal(a):
Muzes uvest priklad jakym zpusobem oznacit/nastavit, aby se persistentni parametry komponenty, prenasely do requestu?
Nekde na forum a v api jsem nasel, ze neco takoveho existuje. Tenhle priklad, mi ale nefunguje (asi delam neco blbe :) )
/**
* @persistent(neco)
*/
class NecoControl extends Control
{
/** @persistent */
public $neco;
}
Potrebuju to pro svuj data grid, abych nemusel uchovavat hodnotu v session.
Diky
Editoval o5 (26. 10. 2010 10:07)
- Tharos
- Člen | 1030
Přes anotace jsem to nezkoušel, běhá mi to přes getPersistentComponents() v presenteru. Kód v BasePresenteru mám zjednodušeně následující:
abstract class BasePresenter extends Presenter
{
public static function getPersistentComponents()
{
return array('myControl');
}
}
A ta komponenta pak vypadá v základu následovně:
class MyControl extends Control
{
/** @persistent */
public $counter = 1;
public static function getPersistentParams()
{
return array('counter');
}
/*** rendery a podobně ***/
}
Ta proměnná $counter se mi pak mezi presentery dědícími z toho BasePresenteru automaticky prenáší (v URL jako myControl-counter). Je to ono? :)
- o5
- Člen | 416
HA, mozna sem narazil na bug.
Muzes prosim Tharos vyzkouset (mozna delam zase neco blbe), jestli se ty persistentni parametry komponenty prenesou i po redirectu?
EDIT: tak jinak, nejsou uz v handleru formu (editFormSubmitted())
Muj zjednoduseny priklad:
class HomePresenter extends Presenter
{
public static function getPersistentComponents()
{
return array('grid');
}
public function editFormSubmitted(AppForm $form)
{
//zde persistentni parametry komponenty nemam (normalni (presenterove) persistentni parametry se prenesou), v action formulare jsou
..............
$this->redirect('default');
}
public function createComponentEditForm()
{
.......
$form->onSubmit[] = array($this, 'editFormSubmitted');
return $form;
}
protected function createComponentGrid()
{
......
}
}
hlaseno zde
Editoval o5 (10. 1. 2011 20:16)
- o5
- Člen | 416
Udelal jsem si takovej hotfix, kdyby nekdo stejne jako ja nemohl cekat na opravu :)
tohle vlozte do vaseho BasePresenteru
public function link($destination, $args = array())
{
if (!is_array($args)) {
$args = func_get_args();
array_shift($args);
}
//MODIFICATION START - add grid persistent params
$grid = $this->getComponent('grid', FALSE);
if ($grid) {
$args = $args + $grid->getParam();
}
//MODIFICATION END
return parent::link($destination, $args);
}
- Roman Ožana
- Člen | 52
Zdá se, že tohle není pořád vyřešeno.
Chybu se ztrácením persistentních parametrů komponent po odeslaní formuláře respektive následném redirectu je možné obejít stačí nahradit
$this->redirect('default');
// za
$this->setView('default');
Editoval Roman Ožana (3. 3. 2011 1:25)
- mildabre
- Člen | 62
Dobrý večer !
Trochu jsem dnes datloval v Nette a také jsem řešil jak to s těmi persistentními parametry je. Objevil jsem toto:
Když označíme parametr v presenteru pomocí anotace jako persistentní:
<?php
/** @persistent */
public $parametr;
?>
Tak se automaticky předává ve všech odkazech generovaných tímto presenterem a jeho napojenými komponentami. Nepřenáší se už ale do odkazů, které sice vedou na tento presenter, ale jsou řízeny jinými presentery – např. hlavní menu aplikace které je řízeno BasePresenterem.
Zajímavé je, že když parametr označíme jako private, přestane jako persistentní fungovat anotace neanotace.
Když jsem takto označil parametr komponenty napojené na presenter, chovalo se to stejně jako kdybych ten parametr označil přímo v presenteru – jinými slovy persistentní parametr komponenty je persistentní v celém presenteru kam je komponenta napojena.
Zkusil jsem inspirován některými pokusy kolegů v Nette také označit i celou komponentu jako persistentní:
<?php
/** @persistent */
class newsBox extends Control
{
.... kód....
}
?>
ale nepozoroval jsem, že by tohle něco dělalo.
Takže se mě to zdá dobře udělané – komponenty vědí, že některé parametry jsou stavové, ale nevědí do kterého presenteru budou připojeny. Komponenta se chová tak, jak je napsaná a nemusíme modifikovat kód presenteru. Já jsem spokojen jak to funguje.
- mildabre
- Člen | 62
Doplňuji k persistentním parametrům komponent:
Testoval jsem persistentní parametr komponenty a zdá se mě, že je to přesně naopak než jsem před chvílí tvrdil – podle mne to nefunguje. Takže asi i proto není v dokumentaci o persistentních parametrech komponent skoro nic napsáno. Zdá se, že persistence komponent je nějaká kachna.
- Filip Procházka
- Moderator | 4668
- prosím neoživuj témata, kde je poslední příspěvek starý dva roky.
- komponenty se jako persistentní označují takto.