Persistentní komponenty – dokumentace

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

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
+
0
-

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
+
0
-

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
+
0
-

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)

norbe
Backer | 405
+
0
-

Tu anotaci @persistent(neco) musíš dát tuším k presenteru (pokud to chceš zachovat všude tak asi k BasePresenteru), ale zatím jsem to nepotřeboval, tak nevím jistě…

Tharos
Člen | 1030
+
0
-

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
+
0
-

Jezis marja, tak to me mohlo napadnout zkusit prepsat tu statickou metodu v presenteru stejne jako se da prepsat getPersistentParams()…

Diky za nakopnuti

o5
Člen | 416
+
0
-

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)

Tharos
Člen | 1030
+
0
-

No jo, fakt že jo. :) Vyzkoušel jsem to a taky jsem o ty parametry přišel. Takže je tam asi bug.

Nevím ale, jak je na tom současná vývojová verze. Testoval jsem to teď jen na jednom archaickém projektu, který běží na Nette 0.9.2-dev. :)

Editoval Tharos (26. 10. 2010 11:31)

o5
Člen | 416
+
0
-

u me Nette Framework 2.0-dev (revision 4272e4b released on 2010–10–14)

o5
Člen | 416
+
0
-

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
+
0
-

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)

Tharos
Člen | 1030
+
0
-

Ono hlavně takový zápis má úplně jinou logiku a nelze jej použít například po úspěšném odeslání formuláře (kdy přirozeně není zájem, aby při stisknutí F5 došlo k odeslání formuláře znovu).

mildabre
Člen | 62
+
0
-

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
+
0
-

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
+
0
-
  1. prosím neoživuj témata, kde je poslední příspěvek starý dva roky.
  2. komponenty se jako persistentní označují takto.