Hlavní navigace

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

Miloš Průdek

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.

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.

Našli jste v článku chybu?

15. 7. 2003 16:29

Laco (neregistrovaný)

Bude tento serial pokracovat aj inymi temami Zope?
Myslim tym ci v buducnosti planujete volne
pokracovania napr. na temu Z SQL Method, alebo inych
zaujimavych technologii...

L.






120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Měšec.cz: Komu musí od ledna zvýšit mzdu?

Komu musí od ledna zvýšit mzdu?

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

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

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

DigiZone.cz: Flix TV: dva set-top boxy za korunu

Flix TV: dva set-top boxy za korunu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

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

Jak vymáhat výživné zadarmo?

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

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

Jsou čajové sáčky toxické?

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

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

Recenze Westworld: zavraždit a...

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky