Pokročilejším druhem jsou komponenty jenž mají vnitřní stav uložený v proměnných který je potřeba zachovat při přechodu na jinou stránku s toutéž komponentou. Základní otázkou je, jak a kde uchovávat tento stav (hodnoty proměnných). Jednou z možností jsou skrytá pole ve formuláři, či přidané parametry v URL cgi skriptu.
Použijeme-li pro uchovávání skrytá pole
<input type="hidden" name="stav_komponenty" value="$stav_komponenty"/>
<input type="hidden" name="stav_komponenty" value="$stav_komponenty"/>
Na toto řešení jsou kladeny následující omezení:
<form>
a </form>
generovat šablona stránky protože stavové proměnné všech komponent musí být uloženy v jednom formuláři. Přesněji všechny formulářové prvky musí být v jednom formuláři. Důvodem je to, že při odeslání dat z formuláře se odešlou jen data toho formuláře, jehož tlačítko bylo stisknuto. Ostatní formuláře se neodesílají a stav v nich uložený by tedy nebyl zachován a přenesen do další stránky.Dopracujeme se tedy ka komponentám jenž jsou prezentovány dvěma funkcemi.
komponenta_state_machine
komponenta_render
První z těchto funkcí, …_state_machine
, ukládá stav do skrytých polí a je volána šablonou stránky na začátku pro zapsání skrytých polí do formuláře vytvářeného touto šablonou. V této funkci proběhnou též všechny výpočty jenž z původního stavu a parametrů předaných formulářem či URL spočtou stav nový jenž bude uložen do skrytého pole. Druhá, …_render
, je volána v okamžiku kdy je třeba vykreslit komponentu.
Mají-li komponenty ovlivňovat hlavičku stránky, musí jejich výpočet proběhnout ještě před vypsáním této hlavičky. Šablona stránky pak musí spusti výpočet stavu komponent a výstup uložit do proměnné aby pak mohla být skrytá pole uložena do tšla stránky. Mají-li se komponenty ovlivňovat navzájem pak nastanou problémy s pořadím v jakém probíhají výpočty. Komponenta která ovlivňuje ostatní musí být spočtena před těmito komponentami.