Hlavní navigace

Šablony stránek pro Zope: smyčka

Miloš Průdek

Š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?