Hlavní navigace

Šablony stránek pro Zope: získávání

Miloš Průdek 9. 5. 2003

Získávání je unikátní technologií Zope, kterou jinde nenajdete. Tato velmi praktická vlastnost umožňuje úsporné a logické programování a tvorbu šablon. Bohužel je následkem její revolučnosti nesnadné ji pochopit jen z definice, a proto v tomto pokračování najdete velmi jednoduchý příklad praktického použití.

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://localhos­t:8080/)

http://localhos­t:8080/test/zisk
http://localhos­t:8080/test/t1/zisk
http://localhos­t:8080/test/t2/zisk
http://localhos­t: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://localhos­t: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.

Našli jste v článku chybu?

26. 6. 2004 18:29

Jerry (bez trojky) (neregistrovaný)

Nebo by místo hledání, jak tam to lomítko dostat, možná stálo za to použít mozek :-)
V odkazech na adresář stačí použít tohle:
<li tal:repeat="slozka slozky">
<a href="slozka" tal:attributes="href python:slozka.absolute_url() + '/'" tal:content="slozka/getId">ID slozky</a>
</li>





26. 6. 2004 18:17

Jerry (bez trojky) (neregistrovaný)

k 2), byť opožděně: Teď jsem si to v rámci osahávání Zope zkoušel, celý problém je v tom, že váš indexový soubor je v prohlížeči prezentován jako by měl URL (např.) "http://server/test/t1", přestože správně by mělo být "http://server/test/t1/". Díky tomu je potom obrázek hledán o adresář výše, prostě prohlížeč to "t1" považuje za soubor a ne za adresář a tudíž hledá v adresáři "test". Stačí na konec URL přidat lomítko a vše je v pořádku. Bohužel zatím nevím, jak to lomítko do odkazů v "index_htm…

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí