60.19.13.4.3. Použití komponent
60.19.13.4.3.1. Komponenta s vnitřním stavem

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í.

60.19.13.4.3.1. Komponenta s vnitřním stavem

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.