Hlavní navigace

Šablony stránek pro Zope: obsah nákupního košíku

11. 7. 2003
Doba čtení: 4 minuty

Sdílet

V dnešním dílu probereme metodu pro zobrazení obsahu nákupního košíku. Při té příležitosti si ukážeme zajímavou a účinnou metodu pro pohotové vkládání logiky do šablon ZPT bez nutnosti psát celý program.

Značka jazyka ZPT, tal:repeat=„item here/getItem“, uvedená na konci minulého dílu, postupně dosazuje do proměnné item hodnoty, dodané skriptem getItem. Zkráceně bychom řekli, že hodnoty skriptu getItem seiterují v proměnné item. V jazyce Python by se tato iterace zapsala takto: for item in getItem:

Skript getItem

Skripty popsané v tomto a v následujících dílech najdete v čerstvé instalaci Zope 2.6.1 ve složce /Examples/Shop­pingCart.

Skript getItem, volaný bez parametrů, vrátí seznam položek na prodej.   Měl by se tedy spojit s databází obsahující položky na prodej. Aby se tento příklad dále nekomplikoval, je spojení s databází vynecháno a prodávané zboží je zapsáno přímo ve zdrojovém textu. Položky jsou zapsány jako slovník slovníků (dictionary of dictionaries) na prvním řádku items={…. Hlavní slovník má řídící prvek item a prvky jsou vnořené slovníky. Každý výskyt vnořeného slovníku obsahuje prvky title (nadpis), description (popis) a price (cena).

Následující řádek if id is not None: zahajuje větev skriptu, která se vykonává, pokud byl skript volán s parametrem. Šablona index_html ale volá tento skript bez parametrů, a tak můžeme tuto větev zatím přeskočit. Všimněte si jen, že větev končí příkazem return, který skript ukončuje, takže když je podmínka if id is not None: pravdivá, skript nepokračuje v dalších řádcích.

Od řádku results=[] začíná větev, která nás zajímá. Zde se vytváří seznam všech prodávaných položek. Následující řádek, zahajující smyčku, for id, item in items.items():, obsahuje výraz items dvakrát v naprosto odlišných významech. První výskyt označuje uživatelskou proměnnou items, definovanou na začátku skriptu. Druhý výskyt jeklíčové slovo jazyka Python, které převádí slovník na seznam tuples. Jasné? Výborně. Pokud se chcete přesto podívat, jak takový převod vypadá v praxi, vzpomeňte si, že Python lze spustit interaktivně na příkazovém řádku a vyzkoušet si naživo, jak funguje:

[prudek]$ python
Python 2.2.1 (#1, Dec 4 2002, 23:43:31)
[GCC 3.2 (Mandrake Linux 9.0 3.2-1mdk)] on linux-i386
>>> a={2:'aa',3:'bb',4:'cc'}
>>> a.items()
[(2, 'aa'), (3, 'bb'), (4, 'cc')]

Každý tuple je rozdělen na své dvě komponenty díky použití dvou řídících proměnných id a item ve smyčcefor id,item… Výsledkem těla smyčky je konverze původního „slovníku slovníků“ na seznam, jehož klíče jsou prvky id a jehož každá položka je slovník. Obsah se tedy nezměnil, zato forma ano.

Prezentace výsledků pro getItem

Výsledek skriptu getItem se octne v šabloně index_html v položce item. Z ní se jednotlivé prvky (title, description, price) vyberou a zobrazí pomocí řádků <td:tal content=…></td>. Vzhled prvku pricepotřebuje trochu doladit. Na pomoc se zavolá podprogram format_money, což je jen alias, definovaný na začátku v příkazu tal:define="global format_money. Název volané procedury dollars_and_cents je zcela výstižný. Zkuste si pro zajímavost vytvořit třeba proceduru koruny_a_halere. Není to triviální úkol a není to povinné. Jako vzor můžete použít soubor lib/python/Pro­ducts/PythonScrip­ts/standard.py, a buď jej doplňte, nebo zkopírujte a upravte tuto kopii.

Odbočka: volání externích skriptů

Pozornému čtenáři neuniklo, že v příkazu tal:define=„global format_money voláme proceduru uloženou v souborovém systému, a přitom bylo v předchozích dílech uvedeno, že skripty v Pythonu (zadávají se přes web a ukládají v databázi ZODB) jsou díky omezené množině funkcí bezpečnější než Externí metody (zadávají se v souborovém systému). Lze tedy použitím skriptu ze souborového systému obejít bezpečnost? Rozhodně ne! Takto "importované“ skripty podléhají prakticky stejným omezením jako skripty v Pythonu.

Vkládání výrazů jazyka Python je tak trochu černou magií a nalezení správného zaklínadla je dost neintuitivní. Uveďme proto pár příkladů, které opravdu fungují:

<p tal:content="python:len('aaa')"></p>

Kromě vestavěné funkce len můžete identicky volat i ostatní vestavěné funkce jazyka Python. Konkrétně funkce None, abs, apply, callable, chr, cmp, complex, delattr, divmod, filter, float, getattr, hash, hex, int, isinstance, issubclass, list, len, long, map, max, min, oct, ord, repr, round, setattr, str a  tuple.

ict ve školství 24

Dále můžete speciální syntaxí volat funkce z modulů string, random a math:

<p tal:content="python:modules['string'].upper('abc')"></p>
<p tal:content="python:modules['random'].choice(['Karel',
'Katka','E.T.'])"></p>
<p tal:content="python:modules['math'].sqrt(2)"></p>

Bez speciálních úprav nemůžete volat jiné funkce než ty z modulů string, random a math. Nicméně tyto tři moduly obsahují snad vše, co je nutné pro naprogramování logiky libovolného webu.