Teprve s použitím komponenet začíná být vytváření/programování stránek zajímavé. Právě komponenty ná dovolí sestavovat stránku z připravených prefabrikovaných stavebních kamenů aniž bychom se v tu chvíli dívali na samotnou realizaci komponent. Jedná se tedy o další stupeň abstrakce.
Komponenty píši do samostatných souborů jenž mají charakter knihoven. Každá komponenta tak nabízí ven řadu funkcí přes než se integruje do stránky. Z mého pohledu je konponenta v podstatě samostatný objekt s vlastními datovými poli, vlastním kódem a odpovídající stavovovu proměnnou. Protože bash není objektovým jazykem a jeho možnosti jsou omezené, považují komponenty za objekty typu singleton. Abych oddělil jmenné prostory pro funkce a proměnné, každá komponenta má svůj jedinečný prefix kterým začínají jména všech jejích funkcí a proměnných.
Základní funkcí je funkce zobrazení/renderování komponenty jejímž výstupem je html kód který se vkládá do stránky. Každá komponenta tedy musí nabízet nejméně jednu funkci a to je funkce
komponenta_render
Nejjednodušší komponenta může tedy vypadat takto:
# komponenta function komponenta_render() { cat <<EOF Hello world! EOF }
Takováto komponenta je samozřejmě velmi primitivní a statická, postrádá jakoukoliv dynamicitu v chování. To ovšem neznamená že je zbytečná. Například budeme potřebovat zobrazi stav odpovídající nějaké periferii, obsahu databáze či nejakého příznaku. V takovém případě komponenta jen zapouzdří kód jenž tuto informaci zjišťuje a formuje html kód ji popisující.
Takováto komponenta je pro nás již zajímavější. Má svůj vnitřní stav který se mezi jednotlivými voláními/zobrazováním stránky může měnit a nabízí nám taky základní možnosti interakce s komponentou. Opět komponenta navenek prezentuje renderovací funkci která je již ovšem vnitřně složitější.
function komponenta_render() { local -r state=$(param komponenta_state) case $state in stav-první) # zobraz komponentu ;; stav-druhý) # zobraz komponentu jinak ;; *) # stav hlaví, implicitní # zobraz komponentu ;; esac }
Principem fungování je tedy že v každém stavu zobrazuje komponenta jinak, jiným html kódem. Jistě jste si všimli, že stav komponenty se čte z parametru komponenta_state. Aby vše fungovalo tak ja chceme, musíme zajistit že stav komponenty bude v CGI prostředí, tedy že bude předán do stránky buďto formulářem nebo parametrem v URL. Toho dosáhneme například tak, že komponenta sama vkládá do svého html kódu skryté pole.
<form> <!--Formulář zahrnující všechny komponenty-->
...
<input type="hidden" name="komponenta_state"
value="stav"/>
...
</form>
Protože při stisku tlačítka jsou odeslána jen data v tomto formuláři, musí být všechny komponenty na jednom formuláři. Toho dosáhneme tak, že komponenty samy nevypisují <form> a </form> tagy ale musíme se o vypsání těchto tagů postarat sami.