Získávání: dědičnost pro URL
Objektové programovací jazyky používají dědičnost pro zjednodušení zdrojového kódu. Zope používá velmi koncepci, která se nazývá získávání (acquisition). Zope totiž hledá šablony a jiné objekty nejen ve složce, na kterou ukazuje aktuální URL, ale postupně ve všech podřízených složkách.
Zkusme to na praktickém příkladu. Do složky /test vložte následující šablonu a nazvěte ji třeba zisk:
<body bgcolor="white" tal:attributes="bgcolor here/barva"> <p>Barva podkladu závisí na složce</p> </body>
Šablona zisk používá příkaz tal:attributes pro nastavení barvy podkladu stránky. Spoléhá se přitom na existenci další šablony (nebo DTML dokumentu, jak záhy uvidíte) s názvem barva.
Nyní ve složce /test vytvořte šablonu barva. Jejím obsahem bude jeden řádek s jedním slovem: white. Ve složce /test/t1/t11 vytvořte další šablonu, opět s názvem barva. Tentokrát v ní ale bude slovo cyan.
Zkuste nyní do prohlížeče zadat následující adresy (předpokládám, že vaše Zope běží na adrese http://localhost:8080/)
http://localhost:8080/test/zisk
http://localhost:8080/test/t1/zisk
http://localhost:8080/test/t2/zisk
http://localhost:8080/test/t1/t11/zisk
Jak vidíte, jen na adrese /test/t1/11/zisk se projevil modrozelený podklad. Šablona zisk je jenom ve složce /test, ale díky technologii získávání je vidět i ze všech podřízených složek. Když Zope zobrazuje šablonu zisk, snaží se najít šablonu barva a při hledání postupuje směrem nahoru. Výsledek tohoto hledání závisí na tom, ve které jsme složce.
- Například když jsme ve složce /test/t2, hledá Zope šablonu barva nejprve v aktuální složce. Protože tam není, hledá dále ve složce /test. Tam nachází šablonu nazvanou barva a úspěšně zobrazí bílou stránku.
- Když je aktuální složka /test/t1/t11, Zope se dívá nejprve do této aktuální složky. Okamžítě nachází zdejší šablonu barva a zobrazí tedy modrozelenou stránku
Tato technologie získávání se nemusí uplatnit jen na příkaz tal:attributes, ale i na libovolný jiný příkaz ZPT. Nahrazovat lze i velké úseky HTML, nejen jednotlivý atribut. Technologie získávání není určena jen pro jazyk ZPT. Funguje i pro ostatní technologie Zope, o kterých jsem se zatím nezmínil, jako např. DTML a Python Script.
To v praxi znamená, že položka barva nemusela být nutně typu šablona. V tomto konkrétním případě by se dala použít i položka DTML Document se stejným výsledkem a s menší zátěží pro procesor počítače. Zatím se netrapte otázkou, co přesně je DTML Document, a pohlížejte na něj jako na normální dokument HTML.
Nyní už tedy víte, proč jsme nazvali šablonu v předchozí kapitole právě index_html, proč je tato šablona viditelná ze všech podřízených složek a jaké další využití má technologie získávání, která to umožňuje.
Automatický seznam obrázků
Po intermezzu s technologií získávání, která je pro Zope charakteristická a unikátní, se můžeme vrátit k příkladu index_html z kapitoly Automatická navigace. Nejprve zkusíme původní zdrojový kód obohatit dvěma řádky z předchozí kapitoly. Zcela nahoru do zdrojového textu vložte:
<body bgcolor="white" tal:attributes="bgcolor here/barva">
Aby vznikl platný kód HTML, musíme jako poslední řádek vložit:
</body>
Nyní i šablona index_html zobrazí modrozelený podklad. Přesvědčte se o tom otevřením adresy http://localhost:8080/test/t1/t11/zisk ve vašem prohlížeči.
Automatická tvorba navigace není špatná, ale často je třeba zobrazit i různé položky ve složkách; obrázky, dokumenty, zvuky a podobně. Zkusme se teď podívat, jak by vypadala šablona, která by zobrazila všechny obrázky v aktuální složce. Na konec šablony index_html (tj. před závěrečnou značku <body>) doplňte následující zdrojový kód:
<hr> <div tal:define="obrazky python:here.objectValues('Image')"> <h2>Obrázky, metoda A</h2> <ul tal:condition="obrazky"> <li tal:repeat="obr obrazky"> <img src="Obrázek" tal:attributes="src obr/getId"> </li> </ul> <p tal:condition="not:obrazky"><i>Zde nejsou žádné obrázky.</i></p> </div>
První řádek (značku pro vodorovnou linku samozřejmě nepočítám) se příliš neliší od prvního řádku šablony index_html z kapitoly Automatická navigace. Parametr ‚Image‘ zajistí, že here.objectValues() bude obsahovat seznam obrázků. Opravdu nový je pátý řádek, který používá příkaz tal:attributes pro nastavení atributu SRC značky <IMG>. Volání getId je funkce Zope API, která vrací identifikátor daného objektu.