You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cocoon.apache.org by Christofer Dutz <du...@c-ware.de> on 2005/05/31 15:03:09 UTC
CForm repeater binding problem
Hi,
I am still having problems with repeaters. I have created a small
shoping-cart form which contains a repeater. Every cart wow contains
several output-widgets, one textfield (used for editing the number of
products) and now some row-actions for deleting and mooving up and down
items. I added these for testing since they initiate a submit and
redisplay of a reult page without returning to the flowscript.
This way I could test if it's a binding-problem or a forms-problem.
I am able to update the cart-elements count, delete items and move them
up and down so I guess, that principly everything should be fine. If I
hit the "Next" or "Update" Button control is returned to the Flowscript
and the xml-document sotring the carts content ist updated. If I output
the xml-document (simple Stdout to my Jboss-Logfile) no changes were
made. Could you please give me a hint to where my problem is? Here the code:
Bindng:
<?xml version="1.0" encoding="UTF-8"?>
<fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding"
path="/cart/cartContent">
<fb:repeater id="cartContent" parent-path="content" row-path="product">
<fb:identity id="productNo" path="@productNo"/>
<fb:on-bind>
<fb:value id="count" path="@count"/>
<fb:value id="product" path="@product"/>
<fb:value id="productNo" path="@productNo"/>
<fb:value id="price" path="@price"/>
<fb:value id="totalPrice" path="@totalPrice"/>
</fb:on-bind>
</fb:repeater>
</fb:context>
Form:
<fd:form xmlns:fd="http://apache.org/cocoon/forms/1.0#definition">
<fd:widgets>
<fd:repeater id="cartContent" initial-size="0">
<fd:label>Warenkorb:</fd:label>
<fd:widgets>
<fd:field id="count" requried="true">
<fd:label>Anzahl:</fd:label>
<fd:datatype base="string"/>
</fd:field>
<fd:row-action id="deleteItem" action-command="delete">
<fd:label>Produkt aus Warenkorb entfernen</fd:label>
</fd:row-action>
<fd:row-action id="itemUp" action-command="move-up">
<fd:label>Produkt nach oben bewegen</fd:label>
</fd:row-action>
<fd:row-action id="itemDown" action-command="move-down">
<fd:label>Produkt nach unten bewegen</fd:label>
</fd:row-action>
<fd:output id="product">
<fd:label>Artikel:</fd:label>
<fd:datatype base="string"/>
</fd:output>
<fd:output id="productNo">
<fd:label>Bestellnummer:</fd:label>
<fd:datatype base="string"/>
</fd:output>
<fd:output id="price">
<fd:label>Einzelpreis:</fd:label>
<fd:datatype base="string"/>
</fd:output>
<fd:output id="totalPrice">
<fd:label>Gesamtpreis:</fd:label>
<fd:datatype base="string"/>
</fd:output>
</fd:widgets>
</fd:repeater>
<fd:submit id="updateButton" validate="true">
<fd:label>Aktualisieren</fd:label>
</fd:submit>
<fd:submit id="nextButton" validate="true">
<fd:label>Weiter</fd:label>
</fd:submit>
</fd:widgets>
</fd:form>
Template:
<page xmlns:ft="http://apache.org/cocoon/forms/1.0#template"
xmlns:fi="http://apache.org/cocoon/forms/1.0#instance">
<title>Warenkorb</title>
<include src="/shop/utils/forms-lib.js"/>
<paragraph style="width:990px;height:445px">
<ft:form-template action="#{$continuation/id}.continue"
method="POST">
<paragraph style="width:990px;height:385px">
<br/>
<paragraph
style="width:18px;height:25px;float:left;border:none;">
<image url="/images/popup-button-left.gif"/>
</paragraph>
<paragraph
style="width:140px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
<ft:repeater-widget-label id="cartContent"
widget-id="count"/>
</paragraph>
<paragraph
style="width:410px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
<ft:repeater-widget-label id="cartContent"
widget-id="product"/>
</paragraph>
<paragraph
style="width:200px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
<ft:repeater-widget-label id="cartContent"
widget-id="productNo"/>
</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
<ft:repeater-widget-label id="cartContent"
widget-id="price"/>
</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
<ft:repeater-widget-label id="cartContent"
widget-id="totalPrice"/>
</paragraph>
<paragraph
style="width:18px;height:25px;float:left;border:none;">
<image url="/images/popup-button-right.gif"/>
</paragraph>
<ft:repeater-widget id="cartContent">
<paragraph style="width:990px;height:25px">
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
<paragraph
style="width:140px;height:25px;float:left;border:none;text-align:left;">
<ft:widget id="count">
<fi:styling style="width:60px"/>
</ft:widget>
<ft:widget id="deleteItem">
<fi:styling type="image"
src="/images/delete.gif"/>
</ft:widget>
<ft:widget id="itemUp">
<fi:styling type="image"
src="/images/up.gif"/>
</ft:widget>
<ft:widget id="itemDown">
<fi:styling type="image"
src="/images/down.gif"/>
</ft:widget>
</paragraph>
<paragraph
style="width:410px;height:25px;float:left;border:none;text-align:left;">
<ft:widget id="product"/>
</paragraph>
<paragraph
style="width:200px;height:25px;float:left;border:none;text-align:left;">
<ft:widget id="productNo"/>
</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border:none;text-align:left;">
<ft:widget id="price"/>
</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border:none;text-align:left;">
<ft:widget id="totalPrice"/>
</paragraph>
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
</paragraph>
</ft:repeater-widget>
<br/>
<paragraph style="width:990px;height:25px">
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
<paragraph
style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Gesamt
Bestellwert:</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">orderValue</paragraph>
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
</paragraph>
<br/>
<paragraph style="width:990px;height:25px">
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
<paragraph
style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Porto
& Verpackung (frei ab 100,00 Bestellwert):</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">0.00</paragraph>
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
</paragraph>
<br/>
<paragraph style="width:990px;height:25px">
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
<paragraph
style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Gesamtpreis:</paragraph>
<paragraph
style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">0.00</paragraph>
<paragraph
style="width:18px;height:25px;float:left;border:none;"/>
</paragraph>
</paragraph>
<paragraph style="width:570px;height:35px;margin-left:420px">
<table style="width:570px;empty-cells:show">
<row>
<cell style="width:190px;tex-align:center">
<ft:widget id="updateButton">
<fi:styling type="image"
src="/images/buttons/Aktualisieren.png"/>
</ft:widget>
</cell>
<cell style="width:190px;tex-align:center">
</cell>
<cell style="width:190px;tex-align:center">
<ft:widget id="nextButton">
<fi:styling type="image"
src="/images/buttons/Weiter.png"/>
</ft:widget>
</cell>
</row>
</table>
</paragraph>
</ft:form-template>
</paragraph>
</page>
Flowscruipt:
importClass(javax.xml.parsers.DocumentBuilderFactory);
importClass(org.apache.xpath.XPathAPI);
importClass(org.apache.xpath.XPathAPI);
importClass(org.w3c.dom.Document);
importClass(org.w3c.dom.Node);
importClass(org.w3c.dom.Element);
importClass(org.w3c.dom.NodeList);
importClass(org.apache.xml.serialize.XMLSerializer);
importClass(java.io.StringWriter);
// load CForms support
cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");
var cart = null;
function getCart() {
if(cart == null) {
this.cart =
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
var cartRoot = this.cart.createElement("cart");
this.cart.appendChild(cartRoot);
var cartContent = this.cart.createElement("cartContent");
cartRoot.appendChild(cartContent);
var cartContentContent = this.cart.createElement("content");
cartContent.appendChild(cartContentContent);
var billingAddress = this.cart.createElement("billingAddress");
cartRoot.appendChild(billingAddress);
var shippingAddress = this.cart.createElement("shippingAddress");
cartRoot.appendChild(shippingAddress);
// For debugging purposes
var product = this.cart.createElement("product");
cartContentContent.appendChild(product);
product.setAttribute("productNo", "ABC");
product.setAttribute("product", "Testprodukt");
product.setAttribute("count", "5");
product.setAttribute("price", "42.23");
product.setAttribute("totalPrice", "211.15");
var product2 = this.cart.createElement("product");
cartContentContent.appendChild(product2);
product2.setAttribute("productNo", "ABCD");
product2.setAttribute("product", "Testprodudfggkt");
product2.setAttribute("count", "8");
product2.setAttribute("price", "424.23");
product2.setAttribute("totalPrice", "2141.15");
print("created new cart document");
}
return cart;
}
function printCart() {
var serializer = new XMLSerializer();
var writer = new StringWriter();
serializer.setOutputCharStream(writer);
serializer.serialize(cart);
print(writer.toString());
}
/*
Function for dealing with the shoping cart itself. It herby has to
deal with updating the carts content, removing products from the
cart and doin the order processing
*/
function showCart() {
print("showCart");
getCart();
// Initialize the forms and create their corresponding bindings.
var cartForm = new Form("shop/forms/shoppingCartForm.xml");
cartForm.createBinding("shop/bindings/shoppingCartBinding.xml");
var addressForm = new Form("shop/forms/billingAddressForm.xml");
addressForm.createBinding("shop/bindings/billingAddressBinding.xml");
var shippingForm = new Form("shop/forms/shippingAddressForm.xml");
shippingForm.createBinding("shop/bindings/shippingAddressBinding.xml");
var summaryForm = new Form("shop/forms/summaryForm.xml");
summaryForm.createBinding("shop/bindings/summaryBinding.xml");
// Initialize the variables for locally tracking the users state.
var local = cocoon.createPageLocal();
local.loop = true;
local.state = 1;
while(local.loop) {
printCart();
switch(local.state) {
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Send the cart form
/////////////////////////////////////////////////////////////////////////////////////////////////////////
case 1: {
cartForm.load(cart);
cartForm.showForm("shop/shoppingCartTemplate.jexl");
cartForm.save(cart);
if(cartForm.submitId == "nextButton") {
local.state = 2;
}
break;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Send the address form
/////////////////////////////////////////////////////////////////////////////////////////////////////////
case 2: {
addressForm.load(cart);
addressForm.showForm("shop/billingAddressTemplate.jexl");
addressForm.save(cart);
// Depending on if an alternate shipping-address should
// be entered, go to the shipping-address-page or directly
// proceed to the confirmation-page.
if(addressForm.submitId == "prevButton") {
local.state = 1;
} else if(addressForm.submitId == "nextButton") {
if(addressForm.lookupWidget("/differentShippingAddress").getValue() ==
"true") {
local.state = 3;
} else {
local.state = 4;
}
}
break;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Send the shipping form
/////////////////////////////////////////////////////////////////////////////////////////////////////////
case 3: {
shippingForm.load(cart);
shippingForm.showForm("shop/shippingAddressTemplate.jexl");
shippingForm.save(cart);
if(shippingForm.submitId == "prevButton") {
local.state = 2;
} else if(shippingForm.submitId == "nextButton") {
local.state = 4;
}
break;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Send the summary form
/////////////////////////////////////////////////////////////////////////////////////////////////////////
case 4: {
summaryForm.load(cart);
summaryForm.showForm("shop/summaryTemplate.jexl");
if(summaryForm.submitId == "prevButton") {
if(addressForm.lookupWidget("/differentShippingAddress").getValue() ==
"true") {
local.state = 3;
} else {
local.state = 2;
}
} else if(summaryForm.submitId == "nextButton") {
local.state = 5;
}
break;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Send the order and return a confirmation form
/////////////////////////////////////////////////////////////////////////////////////////////////////////
case 5: {
cocoon.sendPage("shop/sendOrder.xsp");
local.loop = false;
break;
}
}
}
}
Sample Xml-Document created in the getCart method:
<?xml version="1.0"?>
<cart>
<cartContent>
<content>
<product count="5" price="42.23" product="Testprodukt"
productNo="ABC" totalPrice="211.15"/>
<product count="8" price="424.23" product="Testprodudfggkt"
productNo="ABCD" totalPrice="2141.15"/>
</content>
</cartContent>
<billingAddress/>
<shippingAddress/>
</cart>
Please help me ...
Chris
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org
Re: CForm repeater binding problem
Posted by Christofer Dutz <du...@c-ware.de>.
Ok ... this starts geting sort of a habit, but I think I might just post
my results here. Mabe they will help someone.
In my case I used an ordinary repeater for bining the repeater to my
xml-document. I don't know why, but it seems that updates aren't relayed
to the xml-document automatically.
I had to create a function which is called upon each change of a value.
In this function I simply update my document menually. This worked fine
for me. The downside was that I had to
deal with the "move-up" and "move-down" stuff on my own, wich was sort
of not what I wanted.
On my search I stumbled over the "fb:simple-repeater" binding. After
changing the binding posted below to the folowing everything was
perfect. Sometimes the easy was is the best.
I think I chose the complicated repeater because of the "A simple
repeater binding that will replace (i.e. delete then re-add all) its
content." comment sounded sort of bad.
<?xml version="1.0" encoding="UTF-8"?>
<fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding"
path="/cart/cartContent">
<fb:simple-repeater id="cartContent" parent-path="content"
row-path="product">
<fb:value id="count" path="@count"/>
<fb:value id="product" path="@product"/>
<fb:value id="productNo" path="@productNo"/>
<fb:value id="price" path="@price"/>
<fb:value id="totalPrice" path="@totalPrice"/>
</fb:simple-repeater>
</fb:context>
Christofer Dutz wrote:
> Hi,
>
> I am still having problems with repeaters. I have created a small
> shoping-cart form which contains a repeater. Every cart wow contains
> several output-widgets, one textfield (used for editing the number of
> products) and now some row-actions for deleting and mooving up and down
> items. I added these for testing since they initiate a submit and
> redisplay of a reult page without returning to the flowscript.
> This way I could test if it's a binding-problem or a forms-problem.
> I am able to update the cart-elements count, delete items and move them
> up and down so I guess, that principly everything should be fine. If I
> hit the "Next" or "Update" Button control is returned to the Flowscript
> and the xml-document sotring the carts content ist updated. If I output
> the xml-document (simple Stdout to my Jboss-Logfile) no changes were
> made. Could you please give me a hint to where my problem is? Here the
> code:
>
> Bindng:
> <?xml version="1.0" encoding="UTF-8"?>
> <fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding"
> path="/cart/cartContent">
> <fb:repeater id="cartContent" parent-path="content"
> row-path="product">
> <fb:identity id="productNo" path="@productNo"/>
> <fb:on-bind>
> <fb:value id="count" path="@count"/>
> <fb:value id="product" path="@product"/>
> <fb:value id="productNo" path="@productNo"/>
> <fb:value id="price" path="@price"/>
> <fb:value id="totalPrice" path="@totalPrice"/>
> </fb:on-bind>
> </fb:repeater>
> </fb:context>
>
> Form:
> <fd:form xmlns:fd="http://apache.org/cocoon/forms/1.0#definition">
> <fd:widgets>
> <fd:repeater id="cartContent" initial-size="0">
> <fd:label>Warenkorb:</fd:label>
> <fd:widgets>
> <fd:field id="count" requried="true">
> <fd:label>Anzahl:</fd:label>
> <fd:datatype base="string"/>
> </fd:field>
> <fd:row-action id="deleteItem" action-command="delete">
> <fd:label>Produkt aus Warenkorb entfernen</fd:label>
> </fd:row-action>
> <fd:row-action id="itemUp" action-command="move-up">
> <fd:label>Produkt nach oben bewegen</fd:label>
> </fd:row-action>
> <fd:row-action id="itemDown" action-command="move-down">
> <fd:label>Produkt nach unten bewegen</fd:label>
> </fd:row-action>
> <fd:output id="product">
> <fd:label>Artikel:</fd:label>
> <fd:datatype base="string"/>
> </fd:output>
> <fd:output id="productNo">
> <fd:label>Bestellnummer:</fd:label>
> <fd:datatype base="string"/>
> </fd:output>
> <fd:output id="price">
> <fd:label>Einzelpreis:</fd:label>
> <fd:datatype base="string"/>
> </fd:output>
> <fd:output id="totalPrice">
> <fd:label>Gesamtpreis:</fd:label>
> <fd:datatype base="string"/>
> </fd:output>
> </fd:widgets>
> </fd:repeater>
> <fd:submit id="updateButton" validate="true">
> <fd:label>Aktualisieren</fd:label>
> </fd:submit>
> <fd:submit id="nextButton" validate="true">
> <fd:label>Weiter</fd:label>
> </fd:submit>
> </fd:widgets>
> </fd:form>
>
> Template:
> <page xmlns:ft="http://apache.org/cocoon/forms/1.0#template"
> xmlns:fi="http://apache.org/cocoon/forms/1.0#instance">
> <title>Warenkorb</title>
> <include src="/shop/utils/forms-lib.js"/>
> <paragraph style="width:990px;height:445px">
> <ft:form-template action="#{$continuation/id}.continue"
> method="POST">
> <paragraph style="width:990px;height:385px">
> <br/>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;">
> <image url="/images/popup-button-left.gif"/>
> </paragraph>
> <paragraph
> style="width:140px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
>
> <ft:repeater-widget-label id="cartContent"
> widget-id="count"/>
> </paragraph>
> <paragraph
> style="width:410px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
>
> <ft:repeater-widget-label id="cartContent"
> widget-id="product"/>
> </paragraph>
> <paragraph
> style="width:200px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
>
> <ft:repeater-widget-label id="cartContent"
> widget-id="productNo"/>
> </paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
>
> <ft:repeater-widget-label id="cartContent"
> widget-id="price"/>
> </paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border:none;background-color:rgb(60,70,131);text-align:left;">
>
> <ft:repeater-widget-label id="cartContent"
> widget-id="totalPrice"/>
> </paragraph>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;">
> <image url="/images/popup-button-right.gif"/>
> </paragraph>
> <ft:repeater-widget id="cartContent">
> <paragraph style="width:990px;height:25px">
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> <paragraph
> style="width:140px;height:25px;float:left;border:none;text-align:left;">
> <ft:widget id="count">
> <fi:styling style="width:60px"/>
> </ft:widget>
> <ft:widget id="deleteItem">
> <fi:styling type="image"
> src="/images/delete.gif"/>
> </ft:widget>
> <ft:widget id="itemUp">
> <fi:styling type="image"
> src="/images/up.gif"/>
> </ft:widget>
> <ft:widget id="itemDown">
> <fi:styling type="image"
> src="/images/down.gif"/>
> </ft:widget>
> </paragraph>
> <paragraph
> style="width:410px;height:25px;float:left;border:none;text-align:left;">
> <ft:widget id="product"/>
> </paragraph>
> <paragraph
> style="width:200px;height:25px;float:left;border:none;text-align:left;">
> <ft:widget id="productNo"/>
> </paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border:none;text-align:left;">
> <ft:widget id="price"/>
> </paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border:none;text-align:left;">
> <ft:widget id="totalPrice"/>
> </paragraph>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> </paragraph>
> </ft:repeater-widget>
> <br/>
> <paragraph style="width:990px;height:25px">
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> <paragraph
> style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Gesamt
>
> Bestellwert:</paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">orderValue</paragraph>
>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> </paragraph>
> <br/>
> <paragraph style="width:990px;height:25px">
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> <paragraph
> style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Porto
>
> & Verpackung (frei ab 100,00 Bestellwert):</paragraph>
> <paragraph
> style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">0.00</paragraph>
>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> </paragraph>
> <br/>
> <paragraph style="width:990px;height:25px">
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> <paragraph
> style="width:850px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:left;">Gesamtpreis:</paragraph>
>
> <paragraph
> style="width:100px;height:25px;float:left;border-top-width:1px;border-top-style:solid;border-color:#CCCC99;text-align:right;">0.00</paragraph>
>
> <paragraph
> style="width:18px;height:25px;float:left;border:none;"/>
> </paragraph>
> </paragraph>
> <paragraph style="width:570px;height:35px;margin-left:420px">
> <table style="width:570px;empty-cells:show">
> <row>
> <cell style="width:190px;tex-align:center">
> <ft:widget id="updateButton">
> <fi:styling type="image"
> src="/images/buttons/Aktualisieren.png"/>
> </ft:widget>
> </cell>
> <cell style="width:190px;tex-align:center">
> </cell>
> <cell style="width:190px;tex-align:center">
> <ft:widget id="nextButton">
> <fi:styling type="image"
> src="/images/buttons/Weiter.png"/>
> </ft:widget>
> </cell>
> </row>
> </table>
> </paragraph>
> </ft:form-template>
> </paragraph>
> </page>
>
> Flowscruipt:
> importClass(javax.xml.parsers.DocumentBuilderFactory);
> importClass(org.apache.xpath.XPathAPI);
> importClass(org.apache.xpath.XPathAPI);
> importClass(org.w3c.dom.Document);
> importClass(org.w3c.dom.Node);
> importClass(org.w3c.dom.Element);
> importClass(org.w3c.dom.NodeList);
>
> importClass(org.apache.xml.serialize.XMLSerializer);
> importClass(java.io.StringWriter);
>
> // load CForms support
> cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");
>
>
> var cart = null;
>
> function getCart() {
> if(cart == null) {
> this.cart =
> DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
> var cartRoot = this.cart.createElement("cart");
> this.cart.appendChild(cartRoot);
>
> var cartContent = this.cart.createElement("cartContent");
> cartRoot.appendChild(cartContent);
> var cartContentContent = this.cart.createElement("content");
> cartContent.appendChild(cartContentContent);
> var billingAddress = this.cart.createElement("billingAddress");
> cartRoot.appendChild(billingAddress);
> var shippingAddress = this.cart.createElement("shippingAddress");
> cartRoot.appendChild(shippingAddress);
>
> // For debugging purposes
> var product = this.cart.createElement("product");
> cartContentContent.appendChild(product);
> product.setAttribute("productNo", "ABC");
> product.setAttribute("product", "Testprodukt");
> product.setAttribute("count", "5");
> product.setAttribute("price", "42.23");
> product.setAttribute("totalPrice", "211.15");
>
> var product2 = this.cart.createElement("product");
> cartContentContent.appendChild(product2);
> product2.setAttribute("productNo", "ABCD");
> product2.setAttribute("product", "Testprodudfggkt");
> product2.setAttribute("count", "8");
> product2.setAttribute("price", "424.23");
> product2.setAttribute("totalPrice", "2141.15");
>
> print("created new cart document");
> }
> return cart;
> }
>
> function printCart() {
> var serializer = new XMLSerializer();
> var writer = new StringWriter();
> serializer.setOutputCharStream(writer);
> serializer.serialize(cart);
> print(writer.toString());
> }
>
> /*
> Function for dealing with the shoping cart itself. It herby has to
> deal with updating the carts content, removing products from the
> cart and doin the order processing
> */
> function showCart() {
> print("showCart");
> getCart();
>
> // Initialize the forms and create their corresponding bindings.
> var cartForm = new Form("shop/forms/shoppingCartForm.xml");
> cartForm.createBinding("shop/bindings/shoppingCartBinding.xml");
> var addressForm = new Form("shop/forms/billingAddressForm.xml");
> addressForm.createBinding("shop/bindings/billingAddressBinding.xml");
> var shippingForm = new Form("shop/forms/shippingAddressForm.xml");
>
> shippingForm.createBinding("shop/bindings/shippingAddressBinding.xml");
> var summaryForm = new Form("shop/forms/summaryForm.xml");
> summaryForm.createBinding("shop/bindings/summaryBinding.xml");
>
> // Initialize the variables for locally tracking the users state.
> var local = cocoon.createPageLocal();
> local.loop = true;
> local.state = 1;
> while(local.loop) {
> printCart();
> switch(local.state) {
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> // Send the cart form
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> case 1: {
> cartForm.load(cart);
> cartForm.showForm("shop/shoppingCartTemplate.jexl");
> cartForm.save(cart);
> if(cartForm.submitId == "nextButton") {
> local.state = 2;
> }
> break;
> }
>
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> // Send the address form
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> case 2: {
> addressForm.load(cart);
> addressForm.showForm("shop/billingAddressTemplate.jexl");
> addressForm.save(cart);
> // Depending on if an alternate shipping-address should
> // be entered, go to the shipping-address-page or directly
> // proceed to the confirmation-page.
> if(addressForm.submitId == "prevButton") {
> local.state = 1;
> } else if(addressForm.submitId == "nextButton") {
>
> if(addressForm.lookupWidget("/differentShippingAddress").getValue() ==
> "true") {
> local.state = 3;
> } else {
> local.state = 4;
> }
> }
> break;
> }
>
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> // Send the shipping form
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> case 3: {
> shippingForm.load(cart);
>
> shippingForm.showForm("shop/shippingAddressTemplate.jexl");
> shippingForm.save(cart);
> if(shippingForm.submitId == "prevButton") {
> local.state = 2;
> } else if(shippingForm.submitId == "nextButton") {
> local.state = 4;
> }
> break;
> }
>
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> // Send the summary form
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> case 4: {
> summaryForm.load(cart);
> summaryForm.showForm("shop/summaryTemplate.jexl");
> if(summaryForm.submitId == "prevButton") {
>
> if(addressForm.lookupWidget("/differentShippingAddress").getValue() ==
> "true") {
> local.state = 3;
> } else {
> local.state = 2;
> }
> } else if(summaryForm.submitId == "nextButton") {
> local.state = 5;
> }
> break;
> }
>
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> // Send the order and return a confirmation form
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> case 5: {
> cocoon.sendPage("shop/sendOrder.xsp");
> local.loop = false;
> break;
> }
> }
> }
> }
>
> Sample Xml-Document created in the getCart method:
> <?xml version="1.0"?>
> <cart>
> <cartContent>
> <content>
> <product count="5" price="42.23" product="Testprodukt"
> productNo="ABC" totalPrice="211.15"/>
> <product count="8" price="424.23" product="Testprodudfggkt"
> productNo="ABCD" totalPrice="2141.15"/>
> </content>
> </cartContent>
> <billingAddress/>
> <shippingAddress/>
> </cart>
>
> Please help me ...
> Chris
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
> For additional commands, e-mail: users-help@cocoon.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
For additional commands, e-mail: users-help@cocoon.apache.org