coliver     2003/03/22 14:52:55

  Modified:    src/scratchpad/webapp/samples/petstore sitemap.xmap
               src/scratchpad/webapp/samples/petstore/flow petstore.js
               src/scratchpad/webapp/samples/petstore/stylesheets
                        site2html.xsl
  Added:       src/scratchpad/webapp/samples/petstore/stylesheets
                        form2html.xsl
               src/scratchpad/webapp/samples/petstore/view/xmlform
                        EditAccountForm.xml
  Log:
  first attempt at including XMLForm in this sample
  
  Revision  Changes    Path
  1.8       +43 -2     cocoon-2.1/src/scratchpad/webapp/samples/petstore/sitemap.xmap
  
  Index: sitemap.xmap
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/scratchpad/webapp/samples/petstore/sitemap.xmap,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- sitemap.xmap      20 Mar 2003 06:37:58 -0000      1.7
  +++ sitemap.xmap      22 Mar 2003 22:52:55 -0000      1.8
  @@ -3,6 +3,9 @@
   
     <!-- =========================== Components ================================ -->
     <map:components> 
  +    <map:transformers default="xslt">
  +      <map:transformer name="xmlform" 
src="org.apache.cocoon.transformation.XMLFormTransformer" 
logger="xmlform.sitemap.transformer"/>
  +    </map:transformers>
       <map:generators default="file">
           <map:generator label="content,data" 
logger="sitemap.generator.flow_velocity" name="flow_velocity" 
src="org.apache.cocoon.generation.FlowVelocityGenerator"/>
       </map:generators>
  @@ -46,18 +49,56 @@
   
       <map:pipeline>
         <map:match pattern="*.kont">
  -        <map:call continuation="{1}"/>
  +        <map:call continuation="{1}"/> <!-- 
  +               This handles sendPage*() continuations.
  +           -->
         </map:match>
         <map:match pattern="*.do">
           <map:call function="main">
             <map:parameter name="page" value="{1}"/>
           </map:call>
         </map:match>
  +      <map:match pattern="petstore"> 
  +        <map:call function="xmlForm"/> <!-- 
  +              Without parameters xmlForm() handles XMLForm continuations:
  +           The pattern I'm matching here, "petstore", must match the value 
  +              of the "action" attribute in the view's <xf:submit> elements
  +           -->
  +      </map:match>
         <map:match pattern="">
           <map:call function="index"/>
         </map:match>
  -  </map:pipeline>
  +      <map:match pattern="editAccount.form">
  +        <map:call function="xmlForm">
  +          <map:parameter name="xmlform-function" value="editAccountForm"/>
  +       <map:parameter name="xmlform-id" value="petstore-edit-account"/> <!--
  +                  The value I supply here, "petstore-edit-account", must match 
  +                  the "id" attribute of the view's <xf:form> element
  +             -->
  +          <map:parameter name="xmlform-validator-schema-ns"/> <!-- no validator -->
  +          <map:parameter name="xmlform-validator-schema"/> <!-- no validator -->
  +          <map:parameter name="xmlform-scope" value="session"/>
  +        </map:call>
  +      </map:match>
   
  +      <map:match pattern="view/xmlform/*.xml">
  +           <!-- original XMLForm document -->
  +           <map:generate src="view/xmlform/{1}.xml"/>
  +           
  +           <!-- populating the document with model instance data -->
  +           <map:transform type="xmlform"  label="xml"/>
  +     
  +
  +           <map:transform type="xalan" src="stylesheets/form2html.xsl" />
  +
  +           <!-- Transforming the XMLForm controls to HTML controls -->
  +           <map:transform 
src="context://samples/stylesheets/xmlform/xmlform2html.xsl" />
  +
  +           
  +           <!-- sending the HTML back to the browser -->
  +           <map:serialize type="html" label="debug"/>
  +     </map:match>          
  +    </map:pipeline>
      <map:pipeline>
        <map:match pattern="view/*.xsp">
           <map:generate src="view/xsp/{1}.xsp" type="serverpages"/>
  
  
  
  1.8       +77 -13    
cocoon-2.1/src/scratchpad/webapp/samples/petstore/flow/petstore.js
  
  Index: petstore.js
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/scratchpad/webapp/samples/petstore/flow/petstore.js,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- petstore.js       20 Mar 2003 06:37:58 -0000      1.7
  +++ petstore.js       22 Mar 2003 22:52:55 -0000      1.8
  @@ -46,6 +46,9 @@
   
   // Page Flow for PetStore Application
   
  +// load xml form support
  +cocoon.load("resource://org/apache/cocoon/components/flow/javascript/xmlForm.js");
  +
   var MAX_RESULTS = 5;
   
   var VIEW = "Velocity";
  @@ -96,9 +99,9 @@
       VIEW = cocoon.request.get("view");
       print("setView: VIEW="+VIEW);
       if (VIEW == "Velocity") {
  -     EXT = ".vm";
  +        EXT = ".vm";
       } else if (VIEW == "Xsp") {
  -     EXT = ".xsp";
  +        EXT = ".xsp";
       }
       print("EXT="+EXT);
   }
  @@ -194,7 +197,12 @@
       var category = getPetStore().getCategory(categoryId);
       var skipResults = 0;
       var maxResults = MAX_RESULTS;
  +    var foo = new Object();
  +    foo.skip = skipResults + 0;
       while (true) {
  +        print("foo before=" + foo.skip);
  +        print("skipResults = " + skipResults);
  +        foo.skip = skipResults + 0;
           var productList = 
               getPetStore().getProductListByCategory(categoryId,
                                                      skipResults, 
  @@ -333,18 +341,74 @@
       });
   }
   
  -function editAccountForm() {
  -    if (accountForm.signOn) {
  -        newAccountForm();
  -    } else {
  -        sendPageAndWait("/view/EditAccountForm" + EXT, {
  -                        accountForm: accountForm,
  -                        account: accountForm.account,
  -                        categoryList: categoryList
  -        });
  +//
  +// Edit Account page: example of using XMLForm in a flow script
  +//
  +
  +
  +function validateZIP(field) {
  +    var valid = "0123456789-";
  +    var hyphencount = 0;
  +    if (field.length!=5 && field.length!=10) {
  +        throw "Please enter your 5 digit or 5 digit+4 zip code.";
  +    }
  +    for (var i=0; i < field.length; i++) {
  +        temp = "" + field.substring(i, i+1);
  +        if (temp == "-") hyphencount++;
  +        if (valid.indexOf(temp) == "-1") {
  +            throw "Invalid characters in your zip code";
  +        }
  +    }
  +    if (hyphencount > 1 || (field.length==10 && ""+field.charAt(5)!="-")) {
  +        throw "The hyphen character should be used with a properly formatted 5 
digit+four zip code, like '12345-6789'";
       }
   }
   
  +function validateEmail(value) {
  +    var reg  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  +    return reg.test(value);
  +}
  +
  +function editAccountForm(form) {
  +    var model = {accountForm: accountForm,
  +                 account: accountForm.account,
  +                 categoryList: categoryList, 
  +                 username: accountForm.account.userid,
  +                 password: "",
  +                 password2: ""};
  +    form.setModel(model);
  +    form.sendView("editAccountForm", 
  +                  "view/xmlform/EditAccountForm.xml", 
  +                  function(form) {
  +        for (var i in model.account) {
  +            print(i+"="+model.account[i]);
  +        }
  +        if (model.userName == "") {
  +            form.addViolation("/userName", "User ID is required");
  +        } else {
  +            if (model.password != model.password2) {
  +                form.addViolation("/password2", "Passwords don't match");
  +            }
  +        }
  +        if (account.firstName == "") {
  +            form.addViolation("/account/firstName", "First name is required");
  +        }
  +        if (account.lastName == "") {
  +            form.addViolation("/account/lastName", "Last name is required");
  +        }
  +        if (!validateEmail(account.email)) {
  +            form.addViolation("/account/email", "Email address is invalid");
  +        }
  +        try {
  +            validateZIP(account.zip);
  +        } catch (e) {
  +            form.addViolation("/account/zip", e);
  +        }
  +
  +    });
  +    index();
  +}
  +
   // Search
   
   function searchProducts() {
  @@ -393,8 +457,8 @@
                       view: VIEW,
                       accountForm: accountForm,
                       cartForm: cartForm, 
  -                 yoshi: yoshi,
  -                 cartItems: cartItems
  +                    yoshi: yoshi,
  +                    cartItems: cartItems
       });
       if (accountForm.signOn) {
           signOn();
  
  
  
  1.5       +1 -1      
cocoon-2.1/src/scratchpad/webapp/samples/petstore/stylesheets/site2html.xsl
  
  Index: site2html.xsl
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/scratchpad/webapp/samples/petstore/stylesheets/site2html.xsl,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- site2html.xsl     20 Mar 2003 15:21:16 -0000      1.4
  +++ site2html.xsl     22 Mar 2003 22:52:55 -0000      1.5
  @@ -34,7 +34,7 @@
                                       </xsl:when>
                                       <xsl:otherwise>
                                           <a href="signonForm.do?signoff=true"><img 
border="0" name="img_signout" src="images/sign-out.gif" /></a><img border="0" 
src="images/separator.gif" hspace="4" />
  -                                        <a href="editAccountForm.do"><img 
border="0" name="img_myaccount" src="images/my_account.gif" /></a>
  +                                        <a href="editAccount.form"><img border="0" 
name="img_myaccount" src="images/my_account.gif" /></a>
                                       </xsl:otherwise>
                                   </xsl:choose>
                                   <img border="0" src="images/separator.gif" 
hspace="4" /><a href="../help.html"><img border="0" name="img_help" 
src="images/help.gif" /></a>
  
  
  
  1.1                  
cocoon-2.1/src/scratchpad/webapp/samples/petstore/stylesheets/form2html.xsl
  
  Index: form2html.xsl
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!--
        Cocoon Feedback Wizard XMLForm processing and displaying stylesheet.    
    
    This stylesheet merges an XMLForm document into 
    a final document. It includes other presentational
    parts of a page orthogonal to the xmlform.
  
    author: Ivelin Ivanov, [EMAIL PROTECTED], May 2002
    author: Konstantin Piroumian <[EMAIL PROTECTED]>, September 2002
    author: Simon Price <[EMAIL PROTECTED]>, September 2002
  
  -->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        xmlns:xf="http://xml.apache.org/cocoon/xmlform/2002";
        exclude-result-prefixes="xalan" >
        <xsl:template match="document">
                <html>
                        <head>
                                <title>XMLForm - Cocoon Feedback Wizard</title>
  
                        </head>
                        <body>
                                <xsl:apply-templates />
                        </body>
                </html>
        </xsl:template>
        <xsl:template match="xf:form">
                <xf:form method="post">
                        <xsl:copy-of select="@*" />
                        <br/>
                        <br/>
                        <br/>
                        <br/>
                        <table align="center" border="0">
                                <tr>
                                        <td align="center" colspan="3">
                                                <h1>
                                                        <xsl:value-of 
select="xf:caption"/>
                                                        <hr/>
                                                </h1>
                                        </td>
                                </tr>
                                <xsl:if test="count(error/xf:violation) > 0">
                                        <tr>
                                                <td align="left" colspan="3"
                                                        
class="{error/xf:violation[1]/@class}">
                                                        <p>* There are 
[<b><xsl:value-of
                                                                
select="count(error/xf:violation)"/></b>] 
                                                                errors. Please fix 
these errors and submit the
                                                                form again.</p>
                                                        <p>
                                                                <xsl:variable 
name="localViolations"
                                                                        
select=".//xf:*[ child::xf:violation ]"/>
                                                                <xsl:for-each 
select="error/xf:violation">
                                                                        <xsl:variable 
name="eref" select="./@ref"/>
                                                                        <xsl:if
                                                                                
test="count ($localViolations[ @ref=$eref ]) = 0"
                                                                                >* 
<xsl:value-of select="." /> <br/> </xsl:if>
                                                                </xsl:for-each>
                                                        </p>
                                                        <p/>
                                                </td>
                                        </tr>
                                </xsl:if>
                                <xsl:for-each select="*[name() != 'xf:submit']">
                                        <xsl:choose>
                                                <xsl:when test="name() = 'error'"/>
                                                <xsl:when test="name() = 
'xf:caption'"/>
                                                <xsl:when test="xf:*">
                                                        <xsl:apply-templates 
select="."/>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                        <xsl:copy-of select="."/>
                                                </xsl:otherwise>
                                        </xsl:choose>
                                </xsl:for-each>
                                <tr>
                                        <td align="center" colspan="3">
                                                <xsl:for-each select="*[name() = 
'xf:submit']">
                                                        <xsl:copy-of select="." />
                                                        <xsl:text>
                                                        </xsl:text>
                                                </xsl:for-each>
                                        </td>
                                </tr>
                        </table>
                </xf:form>
        </xsl:template>
        <xsl:template match="xf:repeat">
                <tr width="100%">
                        <td colspan="3" width="100%">
                                <table class="repeat">
                                        <xsl:apply-templates select="*"/>
                                </table>
                        </td>
                </tr>
        </xsl:template>
        <xsl:template match="xf:group">
                <tr width="100%">
                        <td width="100%" colspan="2">
                                <table class="group" border="0">
                                        <tr>
                                                <td align="left">
                                                        <xsl:value-of 
select="xf:caption" />
                                                </td>
                                        </tr>
                                        <xsl:apply-templates select="*"/>
                                </table>
                        </td>
                </tr>
        </xsl:template>
        <xsl:template match="xf:[EMAIL PROTECTED]">
                <div align="center">
                        <hr width="30%"/>
                        <br/>
                        <font size="-1">
                                <code> <xsl:value-of select="xf:caption" /> : 
<xsl:copy-of
                                        select="." /> </code>
                        </font>
                        <br/>
                </div>
        </xsl:template>
        <xsl:template match="xf:caption"/>
        <xsl:template match="xf:*">
                <tr>
                        <td align="left" valign="top">
                                <p class="caption">
                                        <xsl:value-of select="xf:caption" />
                                </p>
                        </td>
                        <td align="left">
                                <table class="plaintable">
                                        <tr>
                                                <td align="left">
                                                        <xsl:copy-of select="." />
                                                </td>
                                                <xsl:if test="xf:violation">
                                                        <td align="left" 
class="{xf:violation[1]/@class}"
                                                                width="100%">
                                                                <xsl:for-each 
select="xf:violation">* 
                                                                        <xsl:value-of 
select="." /> <br/> </xsl:for-each>
                                                        </td>
                                                </xsl:if>
                                        </tr>
                                </table>
                                <xsl:if test="xf:help">
                                        <div class="help">
                                                <xsl:value-of select="xf:help" />
                                        </div>
                                        <br />
                                </xsl:if>
                        </td>
                </tr>
        </xsl:template>
        <xsl:template match="*">
                <xsl:copy-of select="." />
        </xsl:template>
  </xsl:stylesheet>
  
  
  
  1.1                  
cocoon-2.1/src/scratchpad/webapp/samples/petstore/view/xmlform/EditAccountForm.xml
  
  Index: EditAccountForm.xml
  ===================================================================
  <?xml version="1.0"?>
  <document xmlns:xf="http://xml.apache.org/cocoon/xmlform/2002";>
        <xf:form id="petstore-edit-account" view="edit-account" action="petstore" 
method="GET">
                <xf:caption>User Information</xf:caption>
                <error>
                        <xf:violations class="error"/>
                </error>
                <xf:textbox ref="/username">
                        <xf:caption>User ID:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:password ref="/password">
                        <xf:caption>Password:</xf:caption>
                        <xf:violations class="error"/>
                </xf:password>
                <xf:password ref="/password2">
                        <xf:caption>Repeat Password:</xf:caption>
                        <xf:violations class="error"/>
                </xf:password>
                <xf:textbox ref="/account/firstName">
                        <xf:caption>First Name:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/lastName">
                        <xf:caption>Last Name:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/email">
                        <xf:caption>Email:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/phone">
                        <xf:caption>Phone:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/address1">
                        <xf:caption>Address 1:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/address2">
                        <xf:caption>Address 2:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/city">
                        <xf:caption>City:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/state">
                        <xf:caption>State:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/zip">
                        <xf:caption>Zip:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:textbox ref="/account/country">
                        <xf:caption>Country:</xf:caption>
                        <xf:violations class="error"/>
                </xf:textbox>
                <xf:selectOne ref="/account/favCategory">
                   <xf:caption>Favorite Category:</xf:caption>
                   <xf:itemset nodeset="/categoryList">
                        <xf:caption><xf:output ref="name"/></xf:caption>
                        <xf:value><xf:output ref="name"/></xf:value>
                   </xf:itemset>
                </xf:selectOne>
                <xf:selectBoolean ref="/account/listOption">
                        <xf:caption>Enable MyList</xf:caption>
                </xf:selectBoolean>
                <xf:selectBoolean ref="/account/bannerOption">
                        <xf:caption>Enable MyBanner</xf:caption>
                </xf:selectBoolean>
                <xf:submit id="next" continuation="forward" class="button">
                        <xf:caption>Submit</xf:caption>
                        <xf:hint>Submit Account Information</xf:hint>
                </xf:submit>
        </xf:form>
  </document>
  
  
  

Reply via email to