<?xml version="1.0" encoding="utf-8"?>
<list>
<item type="dictionary"><dictionary>
<item key="dtml"><![CDATA[<!-- BO bodyContentZMSCustom_shop -->

<!-- HINT: Code is based on Zope Example Shop -->
<div style="background-color:#eee;border:1px solid #999;padding:1px 6px">
<dtml-if "getObjProperty('title',REQUEST)">
  <h1><dtml-var "getObjProperty('title',REQUEST)"></h1>
<dtml-else>
  <h1>ZMS Simple Shop</h1>
</dtml-if>

<dtml-if currentItems>
<dtml-let shoppingcart="getObjProperty('shoppingcart',REQUEST)">
 <form action="./deleteItems" 
  style="border:1px dotted #999;background-image:url(<dtml-var "shoppingcart.getHref(REQUEST)">);background-repeat: no-repeat;">
</dtml-let>
  <table cellpadding="8" cellspacing="0" border="0">
   <tr><th colspan="4" align="left">Your Shopping Cart</th></tr>
   <tr>
    <th></th> 
    <th align="left">Item</th>
    <th align="left">Price</th> 
    <th align="left">Quantity</th>
   </tr>
   <dtml-in currentItems>
     <tr valign="top" class="small">
       <td align="left"><input type="checkbox" name="ids:list" value="<dtml-var "_['sequence-item']['id']">"></td>
       <td align="left"><dtml-var "_['sequence-item']['title']"></td>
       <td align="left"><dtml-var "_['sequence-item']['price']"></td>
       <td align="left"><dtml-var "_['sequence-item']['quantity']"></td>
     </tr>
   </dtml-in>
   <tr>
     <td colspan="4"><input type="submit" style="font-size:10px" 
       value="Delete Items"></td>
   </tr>
   <tr align="left" class="normal">
     <td colspan="2"></td> 
     <th colspan="2">Total=<br /><span style="color:red"><dtml-var getTotal></span></th>
    </tr>
  </table>
 </form>

<dtml-else>

<p><b>There are currently no items in your shopping cart.</b></p>

</dtml-if>

<h2>Add Items</h2>
<form action="<dtml-var absolute_url>/addItems">
 <table cellpadding="8" cellspacing="0" border="0">
   <tr align="left" class="normal">
     <th align="left">Item</th>
     <th align="left">Description</th>
     <th align="left">Price</th>
     <th align="left">Quantity</th>
   </tr>
   <dtml-in getItem mapping> 
     <tr valign="top" class="small"> 
       <td align="left"><dtml-var title></td>
       <td align="left"><dtml-var description></td>
       <td align="left"><dtml-var price></td>
       <td align="left"><input type="hidden" name="orders.id:records" value="<dtml-var id>"> 
           <input type="text" name="orders.quantity:records" value="0"size="3">
       </td>
     </tr>
   </dtml-in>
   <tr>
     <td colspan="4" align="right"><input style="font-size:10px" 
        type="submit" value="Add Items"></td>
   </tr>
  </table> 
</form>

</div>

<!-- EO bodyContentZMSCustom_shop -->]]></item>
<item key="enabled" type="int">1</item>
<item key="key"><![CDATA[shop]]></item>
<item key="value" type="dictionary"><dictionary>
<item key="__obj_attrs__" type="list"><list>
<item type="dictionary"><dictionary>
<item key="custom"></item>
<item key="default"></item>
<item key="id"><![CDATA[title]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">1</item>
<item key="name"><![CDATA[Titel]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[string]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom" type="file">
<data content_type="image/gif" filename="shop.gif" type="file">47494638396114001400b3000014161474766cfc02fccccecc2422247c7a74d1b1d1770077270000070000d30000000000a01c8ae0c3061412bb00000021f90401000002002c000000001400140003045350c849abbd988e3df20520d07954500440407ec06a15a0d0ceb2400c3195633851a1a81a2dd5b2007c981d05e61bca5297de8842285e50a12c94670a744f0597781220a8c8664f1529597bca61747c4c274500003b</data></item>
<item key="default"></item>
<item key="id"><![CDATA[icon]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[Icon]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[resource]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom" type="file">
<data content_type="image/gif" filename="shoppingCart.gif" type="file">474946383961a7008d00800100ffffffffffff21f90401000001002c00000000a7008d000002ff8c8fa9cbed0fa39cb4da8bb3debcfb0f86e24896e689a6eacab6ee0bc7f24cd7f64d01facef7fecfc30945c0a2b1374c7a8ecca2f2a9694a7dd06a658ad559b790ac970b5e78b3e1f2618c359bd16935983d75bfe152f9965eb757f179bd92dfe4f704c824f8477864a888d0b76818e7a8d818a93749696779a996a95906d929c709ca253a7a1768ba899aea696924e6c4f00a0b44fbe3300be31a9b90abe0cbc81b5c2b0bdcb24bdc2bac9ccc7cfbbb3cdcfc32691c606d806dad8dcd521d7d0d9e2dbe4ddeedbd1a3e3dbe7e66decedd4e9d5e2eaffe0c0d0f9e58d3588f9f0fa0342a01093a1328a3cf3f830591d862e86e1d3f1b0af789bb073122428cff0e07669c518ad2395de9464dbc11d2d149942535ad6459c8d44b9833558e04d932524d8a396ddaa3791353509c318bd98bb711e9c621a2ba29ede8314843a8509a5e7c2af52055763f717cd29a75ea0ea3492d7615c2c9e9bbb21287f22c0a762cd98f1cc36accb8f310dcbb5bf9daf52b37ae96a87fad64522b6f21d5bc7af7d60d2c767064000fa1321ed412f152c5612f3776bbe7e229c76b4033ed19c67355d4a3cf1a66fd5a3429d8ab65cf21dd7a6969dcb15dcfc68d15b260cab84c8706be96ee63c97395ab429ef8aa68d5a97306673ebcb8eddd33af13af5c183076499993f7e5aa9c7a2bc7de1b68d65da97cf4a3e6cf3f2ad9be7978f5dc81e5ff072f1c7aceddc75b3fc6f5b75d0cfc3db7e00a0d3278600a0f22e8db3111ba91920b13428848876db0b29c8722c277c988261658e2892a0ee8d28a2e7e0762882f0212e37033e251236137e298a3783bc2d1a38e3fa211a48f439251a491476628d3924026096594524e496595565e8965965a5298108b3dd2060298a920690299418e51e617671239021b5f3e19269cacf011271d20d2f8019e4dd2d9012163fad927a0a074c801a126215228a2831a1a05a3292ada28a48f0a9a81878b4a8a81a59d681a29a522399a29a83a896a01a72d7a7a01a9a3a25a2aa693f298a89e97c2ba01abafba99279f7fda992baf77cab904b0bba2d926ae39124b02b26b157e95ec87508a19ec86a7da2721895b5e8bed0a0500003b</data></item>
<item key="default"></item>
<item key="id"><![CDATA[shoppingcart]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[Image]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[resource]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"></item>
<item key="default"></item>
<item key="id"><![CDATA[products]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[Products]]></item>
<item key="repetitive" type="int">1</item>
<item key="type"><![CDATA[shopProduct]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"><![CDATA[# --// BO addItems(orders, REQUEST=None) //--
"""
Adds one or more items to the shopping cart. Each
order is a record with an id and a quantity field.
"""
session=context.REQUEST.SESSION

# get the items, items is a dictionary that maps item ids to quantities
items=session.get('items',{})

# get the valid item names for form validation
valid_items=[d['id'] for d in context.getItem()]

for order in orders:
    quantity=hasattr(order, 'quantity') and order.quantity and \
        int(order.quantity) or 0
    if quantity != 0 and hasattr(order, 'id') and order.id in valid_items:
        items[order.id]=items.get(order.id, 0) + quantity

# save items back to session (this is necessary
# since items is a mutable non-persistent object)
session['items']=items

# if called from the web return a response page
if REQUEST is not None:
    return context.REQUEST.RESPONSE.redirect(REQUEST.get('HTTP_REFERER'))

# --// EO addItems //--]]></item>
<item key="default"></item>
<item key="id"><![CDATA[addItems]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[addItems]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[Script (Python)]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"><![CDATA[# --// BO currentItems //--
"""
Returns a list of items that are in the shopping cart.
Each item has a 'quantity' field as well as the normal 'id' and 'description' fields.
"""
request = container.REQUEST
RESPONSE =  request.RESPONSE
session=context.REQUEST.SESSION

quantities=session.get('items', {})
items=[]
for id, quantity in quantities.items():
    item = context.getItem(id)
    if item is not None:
        item['quantity']=quantity
        items.append(item)
return items

# --// EO currentItems //--]]></item>
<item key="default"></item>
<item key="id"><![CDATA[currentItems]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[currentItems]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[Script (Python)]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"><![CDATA[# --// BO deleteItems(ids, REQUEST=None) //--
"""
Remove one or more items from the shopping cart.
"""
session=context.REQUEST.SESSION

# get the items
items=session.get('items',{})

# remove the items
for id in ids:
    if items.has_key(id): del items[id]

# save changes back to the session
session['items']=items

# if this script is called from the web return a response page
if REQUEST is not None:
    return context.REQUEST.RESPONSE.redirect('./')


# --// EO deleteItems //--]]></item>
<item key="default"></item>
<item key="id"><![CDATA[deleteItems]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[deleteItems]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[Script (Python)]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"><![CDATA[# --// BO getItem(id=None) //--
"""
Returns an item given its id. If no id is provided, returns all
available items. In a real shopping cart application, this script
would probably consult a database of some sort.

Each item is a dictionary with an id, title, description, and price.
"""
request = container.REQUEST
RESPONSE =  request.RESPONSE

items={}
# retrieve all items
for item in context.getObjChildren('products',request):
    productDetails={}
    productDetails['title'] = item.getObjProperty('title',request)
    productDetails['description'] = item.getObjProperty('attr_dc_description',request)
    productDetails['price'] = item.getObjProperty('price',request)
    items[item.id] = productDetails

# return requested item
if id is not None:
    item=items.get(id)
    if item is None:
        # no item by that id
        return None
    # add an id field to the record
    item['id']=id
    return item

# return all items
results=[]
for id, item in items.items():
    item['id']=id 
    results.append(item)
return results

# --// EO getItem //--]]></item>
<item key="default"></item>
<item key="id"><![CDATA[getItem]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[getItem]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[Script (Python)]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"><![CDATA[# --// BO getTotal //--
items=context.currentItems()
total=0.0
for item in items:
    total += float(item['price']) * float(item['quantity'])
return total

# --// EO getTotal //--]]></item>
<item key="default"></item>
<item key="id"><![CDATA[getTotal]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[getTotal]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[Script (Python)]]></item>
</dictionary>
</item>
</list>
</item>
<item key="access" type="dictionary"><dictionary>
<item key="edit" type="list"><list>
<item><![CDATA[ZMSAdministrator]]></item>
<item><![CDATA[ZMSAuthor]]></item>
<item><![CDATA[ZMSEditor]]></item>
</list>
</item>
<item key="insert" type="list"><list>
<item><![CDATA[ZMSAdministrator]]></item>
<item><![CDATA[ZMSAuthor]]></item>
<item><![CDATA[ZMSEditor]]></item>
</list>
</item>
</dictionary>
</item>
<item key="acquired" type="int">0</item>
<item key="name"><![CDATA[Shop]]></item>
<item key="package"><![CDATA[com.zms.shop]]></item>
<item key="type"><![CDATA[ZMSObject]]></item>
</dictionary>
</item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="dtml"><![CDATA[<!-- BO bodyContentZMSCustom_shopProduct -->
<dtml-var "getObjProperty('title',REQUEST)">
<br />
<dtml-var "getObjProperty('attr_dc_description',REQUEST)">
<br />
<b><dtml-var "getObjProperty('price',REQUEST)"> EUR</b>
<!-- EO bodyContentZMSCustom_shopProduct -->]]></item>
<item key="enabled" type="int">1</item>
<item key="key"><![CDATA[shopProduct]]></item>
<item key="value" type="dictionary"><dictionary>
<item key="__obj_attrs__" type="list"><list>
<item type="dictionary"><dictionary>
<item key="custom"></item>
<item key="default"></item>
<item key="id"><![CDATA[title]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">1</item>
<item key="name"><![CDATA[Title]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[string]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom" type="file">
<data content_type="image/gif" filename="product.gif" type="file">47494638396110001000e67d00ffadabdd3317ffa09effeed2d8d1a69f564ad5cea3b8495cffe966b85600ad5a18725a58ffc795863d31f3b3a5a8664ad0bb9effa999974e42ffe7b551803ee6ee81e8f083357e33ffe96a7f784bffddc3ff2926fee656ff1c4dac3828457432ffaaa89b5c4b71593dc3f2b0de6800507f3dfa3800581908ffefd3828a1dffebdfffc5b6dfc7adffbe81e1e97cff2050e53b1fff9c9ad4bfa2817a4d945236ff3414a4302095dc939d565b388136fff6f1eb0d09aa920270583cc85444e0e87bcb2107ffa19f9c5347ffe2c6fde555fa00363f883dacf5aab6e6a67b74477e774aafdc9cd52e007f674bffea6ee50703d7d0a5fff4efff2d2aceb99cffdcc2ff201cdf3519ffe7cda35c61ffe1c7ff42249a5b4aff5552aff8adad3929ff40227a6246fff4c17d8518f9e351ff0703b25f1dffa393480f00ffd9a7f11f00b9e9a9cd7a38ff4b16eb0031ffe7cbcf2c00f5fd90ff9d8dff403ca435485d8c4a539c51dde578644c4aff9492e9ab9b8fd68d9f8800ffedbbffffff00000000000021f9040100007d002c00000000100010000007a4807d8283848585452f34820f6d1d867d7383015683078f1e5e402a3001363e8f05656b546f594c280a12850d51436e1a6c265703033a428414236635246813095a2b487484256a69112d617c0c715f4b1f84757a1b02447b081c4152374684175d55784e3c631831644739844d324f0016297076003b2c22843d105c0215623f2e40c89902a6109613790c242100c5c1191c8ffa6c5132834086101109dd5990b123a140003b</data></item>
<item key="default"></item>
<item key="id"><![CDATA[icon]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">0</item>
<item key="name"><![CDATA[Icon]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[resource]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"></item>
<item key="default"></item>
<item key="id"><![CDATA[attr_dc_description]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">1</item>
<item key="name"><![CDATA[Description]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[text]]></item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="custom"></item>
<item key="default"></item>
<item key="id"><![CDATA[price]]></item>
<item key="keys" type="list"><list>
</list>
</item>
<item key="mandatory" type="int">0</item>
<item key="multilang" type="int">1</item>
<item key="name"><![CDATA[Price]]></item>
<item key="repetitive" type="int">0</item>
<item key="type"><![CDATA[amount]]></item>
</dictionary>
</item>
</list>
</item>
<item key="access" type="dictionary"><dictionary>
<item key="edit" type="list"><list>
<item><![CDATA[ZMSAdministrator]]></item>
<item><![CDATA[ZMSAuthor]]></item>
<item><![CDATA[ZMSEditor]]></item>
</list>
</item>
<item key="insert" type="list"><list>
<item><![CDATA[ZMSAdministrator]]></item>
<item><![CDATA[ZMSAuthor]]></item>
<item><![CDATA[ZMSEditor]]></item>
</list>
</item>
</dictionary>
</item>
<item key="acquired" type="int">0</item>
<item key="name"><![CDATA[Product]]></item>
<item key="package"><![CDATA[com.zms.shop]]></item>
<item key="type"><![CDATA[ZMSObject]]></item>
</dictionary>
</item>
</dictionary>
</item>
<item type="dictionary"><dictionary>
<item key="dtml"><![CDATA[<!-- BO bodyContentZMSCustom_com.zms.shop -->


<!-- EO bodyContentZMSCustom_com.zms.shop -->]]></item>
<item key="enabled" type="int">1</item>
<item key="key"><![CDATA[com.zms.shop]]></item>
<item key="value" type="dictionary"><dictionary>
<item key="__obj_attrs__" type="list"><list>
</list>
</item>
<item key="acquired" type="int">0</item>
<item key="name"><![CDATA[com.zms.shop]]></item>
<item key="type"><![CDATA[ZMSPackage]]></item>
</dictionary>
</item>
</dictionary>
</item>
</list>

