Hlavní navigace

Šablony stránek pro Zope: smyčka

Miloš Průdek 2. 5. 2003

Šablony ZPT umožňují i neumožňují programování. Většinu konstrukcí známých z běžných programovacích jazyků v šablonách ZPT nenajdete, ale některé specifické programovací postupy byly rozvinuty tak, aby vyhovovaly smyslu ZPT, tedy prezentaci dat. Mezi těmito postupy je nejdůležitější obyčejná smyčka. Jednoduchou smyčku, představenou v minulém pokračování, si dnes rozebereme řádek po řádku.

V minulém pokračování jste v praxi vyzkoušeli jednoduchou šablonu pro automatické generování navigace. Vypadala takto:

<div tal:define="slozky
python:here.objectValues('Folder')">

 <ul tal:condition="slozky">
   <li tal:repeat="slozka slozky">
     <a href="slozka"

           tal:attributes="href slozka/absolute_url"
           tal:content="slozka/getId">ID slozky</a>
   </li>

 </ul>
 <p tal:condition="not:slozky"><b>Zde nejsou žádné složky.</b></p>

</div>

Vysvětlíme si teď šablonu index_html krok za krokem. Nejprve si všimněte, že prakticky celý zdrojový kód této šablony se skládá z klíčových slov jazyka ZPT, kromě dvou proměnných slozka a slozky a textu Zde nejsou žádné složky.

Hned první řádek je nejsložitější. Za povinným symbolem tal: je nový příkaz define. Tento příkaz vytváří proměnnou, která bude potřebná na několika místech zdrojového textu. V našem příkladu je to proměnná slozky. Bude obsahovat seznam složek obsažených v aktuální složce. Seznam složek poskytuje výraz objectValues(‚Fol­der‘). Tento výraz vypisuje složky právě proto, že jeho parametrem je ‚Folder‘. Jak uvidíme v další kapitole, parametrem výrazu objectValues může být například také ‚Image‘. Výraz je dále upřesněn prefixem here, který znamená „zde, tato složka“. Klíčové slovo python: nám říká, že se jedná o výraz typu Python, tedy o výraz podle syntaxe programovacího jazyka Python. Také seznam vytvořený v proměnné slozky je normálním seznamem jazyka Python a platí pro něj pravidla, uvedená v příručkách pro Python.

Všimněte si, že funkce objectValues() není součástí Pythonu ani jeho standardní knihovny funkcí. Patří totiž do sady funkcí Zope API, které umožňují volat všechny funkce Zope dosažitelné z webového rozhraní Zope (ZMI), jako je přidání dokumentů a obrázků, změna atributů (Properties) a podobně. Jinými slovy, Zope je plně skriptovatelné voláním funkcí Zope API.

Druhý řádek je jednoduchá podmínka tal:condition=„sloz­ky“. Takto obohacená značka <ul> se zobrazí, jen když bude hodnota jejího parametru pravdivá (tedy alespoň z programátorského hlediska :-). Prázdný řetězec, prázdný seznam, číslo nula a vestavěná hodnota nothingjsou nepravdivé. Všechno ostatní je pravdivé. První řádek se postaral o to, že proměnná slozky bude obsahovat prázdný seznam, nejsou-li ve složce žádné podsložky. Pokud je ve složce jedna nebo více podsložek, bude proměnná slozky obsahovat seznam složek v aktuální složce.

Všimněte si, že druhý řádek by se dal napsat tak, že by nevyužíval hodnoty slozky z prvního řádku:

<ul tal:condition="python:here.objectValues('Image')">

To by ale znamenalo nejen zbytečný text navíc, ale hlavně by se funkce objectValues() volala zbytečně dvakrát a zatěžovala tak procesor. Proto zůstaneme u původního zápisu.

Podmínka uvedená ve druhém řádku platí i pro všechny značky HTML vnořené do značky <ul>.

Cyklus zobrazující odkazy na jednotlivé složky je řízen z třetího řádku. Příkaz tal:repeat=„slozka slozky“ znamená, že nová proměnná slozka bude postupně nabývat hodnot ze seznamu slozky. Zároveň se bude opakovat řádek se značkou <li> tolikrát, kolik bude prvků tohoto seznamu.

Čtvrtý řádek ukazuje využití příkazu attributes a také možnost vložit několik příkazů ZPT do jediné značky HTML. Původní značka před přidáním příkazů ZPT byla <a href=„sloz­ka“>ID slozky</a>. Příkaz ZPT tal:content=„sloz­ka/getId“ se postará o nahrazení obsahu značky

<A> voláním funkce getId. To znamená, že getId vloží text na místo mezi značkou <A HREF …> a značkou </A>. Funkce getId je součástí Zope API, které poskytuje mimo jiné i funkce jako getContentType (typ obsahu objektu) a

getSize (velikost objektu).

S příkazem tal:content jsme se setkali hned na začátku. Nový je ale příkaz tal:attributes. Dovoluje upravit atribut značky HTML, do které je vložen. V našem případě upraví atribut HREF značky <A>. Cesta slozka/absolu­te_url obsahuje opět volání velmi často používané funkce Zope API, a to funkce absolute_url. Tato funkce vrací absolutní odkaz na daný objekt, a je proto vhodná pro kotvy HTML.

Následující řádky jen uzavírají značky HTML <li> a <ul>. Poslední příkaz jazyka šablon ZPT je obdobou druhého řádku. Příkaz tal:condition=„not:sloz­ky“ se vykoná, jen když je seznam slozky prázdný. Proto se text Zde nejsou žádné složky objeví jen ve složkách, které neobsahují žádné podsložky.

Na začátku této kapitoly jsem uvedl, že tato šablona se musí jmenovat index_html. To má svůj důvod. Když totiž nějakou šablonu nazvete index_html, bude tato šablona automaticky zavolána, když URL ukazuje na složku místo na konkrétní HTML soubor. Je to tedy stejný princip jako soubor index.html pro Apache nebo default.htm pro Microsoft IIS.

Jak je ale možné, že Zope umí najít index_html nejen ve složce test, kde se tato šablona nachází, ale i v podřízených složkách /test/t1 nebo /test/t1/t11? Je to díky technologii takzvanéhozís­kávání, kterou si představíme v následujícím pokračování.

Našli jste v článku chybu?

6. 5. 2003 14:17

David Pravec (neregistrovaný)

Objektove weby jsou jednodussi na tvorbu a spravu. Neni to jenom moda. Je to otazka nakladu na tvorbu a provoz. Nevidim rozpor mezi objektovost a jednoduchost/prehlednost.

Ta jednoduchost je neco, co muzes vztahovat na vyvojare, content editora/managera, spravce webu, ctenare stranek, tvorbu a udrzbu.
Pro malinky web o dvou html strankach je to celkem jedno, ale kdyz mas >>5 GB dat, uz velice moc zalezi na tom, jakym zpusobem s nimi budes pracovat. Pak vetsinou byva vhodna kombinace …


6. 5. 2003 13:51

David Pravec (neregistrovaný)

Ok, dejte mi ale prosim nekolik dnu,
mam ted hodne prace s jinyma domenama ;-)

Pak se urcite forum na www.zug.cz objevi, planuji dokonce i Chat.

Prozatim ale klidne muzete svoje grafomanske sklony vyřádit na http://www.zug.cz/WikiDoc (ktere se pomalicku stavaji zastaralymi), nebo kazdy ve svem home.

Pokud budete opravdu aktivni, dam vam i prava spravce.








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

Přehledná titulka, průvodci, responzivita

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

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

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

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

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

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

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

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

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

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

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

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

Jsou čajové sáčky toxické?

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

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

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

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

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

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

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

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

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

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

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

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

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

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU