cocoon-docs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From da...@cocoon.zones.apache.org
Subject [DAISY] Updated: XSLT
Date Mon, 08 May 2006 01:18:50 GMT
A document has been updated:

http://cocoon.zones.apache.org/daisy/documentation/485.html

Document ID: 485
Branch: main
Language: default
Name: XSLT (unchanged)
Document Type: Cocoon Document (unchanged)
Updated on: 5/8/06 1:18:29 AM
Updated by: Simone Gianni

A new version has been created, state: draft

Parts
=====
Content
-------
This part has been updated.
Mime type: text/xml (unchanged)
File name:  (unchanged)
Size: 9748 bytes (previous version: 3282 bytes)
Content diff:
(3 equal lines skipped)
    <h1>Intro</h1>
    
    <p>This page contains information on the default XSLT's provided by CForms, and
--- the fi:styling directives they support. Be sure to read first about the
--- <a href="daisy:755">templating mechanism</a>.</p>
+++ the fi:styling directives they support.</p>
    
--- <p>There are basically 3 XSLTs:</p>
+++ <p>As specified in <a href="daisy:755">templating mechanism</a> (be
sure to read
+++ about it), the form template file is transformed in a form instance xml file.
+++ This file contains all the data needed to properly display a form. An XSLT must
+++ then be used to transform the form instance to an HTML to be displayed in a
+++ browser.</p>
    
+++ <p>This XSLT does not need to create also all the page layout (that can be added
+++ by other XSLT, or aggregating the form with other markup), it should only format
+++ the forms field and the form layout.</p>
+++ 
+++ <p>Cocoon forms already a set of XSLTs that does exactly this, they are
+++ "library" stylesheets :</p>
+++ 
    <ul>
--- <li><tt>forms-samples-styling.xsl</tt>: this stylesheet includes two
--- stylesheets: one for widget styling, one for page styling. You can choose
--- between the basic types of it or advanced stylings. Usually, you will make a
--- clone of this stylesheet for your own project, and use the other stylesheets as
--- is.</li>
    <li><tt>forms-field-styling.xsl</tt>: contains templates that style
individual
    widgets, i.e. templates that translate fi:field, fi:booleanfield fi:action, etc.
    to HTML.</li>
    <li><tt>forms-page-styling.xsl</tt>: contains templates for building
high-level
    page layout effects, such as tabbed panes.</li>
--- </ul>
--- 
--- <p>Additionally there are 2 XSLTs for advanced widget styling:</p>
--- 
--- <ul>
    <li><tt>forms-advanced-field-styling.xsl</tt>: contains templates that
provide
    advanced styling of fields, e.g. the "double-listbox" for a multivaluefield.
    It's indeed an extension of the above basic <tt>forms-field-styling.xsl</tt>.
(2 equal lines skipped)
    type "date" and provides a visual calendar for easy selection of date. So the
    calendar is an advanced styling too, but because it has much specific stuff we
    separated it out of <tt>forms-advanced-styling.xsl</tt>.</li>
+++ <li><tt>forms-htmlarea-styling.xsl</tt>: contains the styling for the
html edit
+++ field.</li>
    </ul>
    
--- <p>From the sitemap you only need to reference the first one, for example as
--- follows:</p>
+++ <p>If you have a look at samples, you'll see also another XSLT,
+++ <tt>forms-samples-styling.xsl</tt>. This stylesheet includes other two
+++ stylesheets from the default set. Usually, you will make a clone of this
+++ stylesheet for your own project, have it include the library XSLTs, and
+++ customize what you need by writing templates in this XSLT by giving templates
+++ higher priority than those in the library ones.</p>
    
--- <pre>&lt;map:transform src="context://samples/forms/resources/forms-samples-styling.xsl"/&gt;</pre>
+++ <p>From the sitemap you only need to reference only your custom XSLT, for
+++ example as follows:</p>
    
+++ <pre>&lt;map:transform src="context://forms/resources/myproject-forms-styling.xsl"/&gt;</pre>
+++ 
    <h1>fi:styling options</h1>
    
+++ <p>The fi:styling elements are specified in the template, and offer a way to
+++ customize the way the library XSLTs render widgets. For example :</p>
+++ 
+++ <pre>&lt;ft:widget id="preferredBeer"&gt;
+++   &lt;fi:styling list-type="radio"/&gt;
+++ &lt;/ft:widget&gt;
+++ </pre>
+++ 
    <p>The fi:styling options for the different widgets are documented in the
    respective sections about those widgets.</p>
    
    <h1>High-level styling with fi:group</h1>
    
--- <p>No documentation yet, checkout the samples and the source of
--- forms-page-styling.xsl.</p>
+++ <p>It's quite common to want to layout the form. For example, have part of the
+++ form displayed in a table with two columns, one with labels the other one with
+++ actual fields, while in another part have a single colum with labels followed by
+++ fields, and in another part some tabs to group together fields.</p>
    
--- <p>For storing the state of a tab or choice selection server-side just add a
--- field to the form definition that shall hold this value:</p>
+++ <p>We could do this simply writing HTML in the template file, but this is
+++ verbose, non reusable, and not easy to style. That's why fi:groups are there.
+++ You can layout your form with fi:groups in a simple, efficient, extensible and
+++ easy to style way. For example :</p>
    
--- <pre>&lt;fd:field id="state"&gt;
+++ <pre>&lt;ft:form-template .... &gt;
+++   &lt;fi:group&gt;
+++     &lt;fi:styling layout="columns"&gt;
+++     &lt;fi:items&gt;
+++       &lt;ft:widget id="name"/&gt;
+++       &lt;ft:widget id="surname"/&gt;
+++       &lt;ft:widget id="birthday"/&gt;
+++     &lt;/fi:items&gt;
+++   &lt;/fi:group&gt;
+++ &lt;/ft:form-template&gt;
+++ </pre>
+++ 
+++ <p>Will produce a table with two columns, like the following :</p>
+++ 
+++ <table>
+++ <tbody>
+++ <tr>
+++ <td>
+++ <p>Name</p>
+++ </td>
+++ <td>
+++ <p>[_______]</p>
+++ </td>
+++ </tr>
+++ <tr>
+++ <td>
+++ <p>Surname</p>
+++ </td>
+++ <td>
+++ <p>[_______]</p>
+++ </td>
+++ </tr>
+++ <tr>
+++ <td>
+++ <p>Birthday</p>
+++ </td>
+++ <td>
+++ <p>[_______]</p>
+++ </td>
+++ </tr>
+++ </tbody>
+++ </table>
+++ 
+++ <p>The <tt>fi:group</tt> accept either a <tt>layout</tt>
or a <tt>type</tt>
+++ attribute in its <tt>fi:styling</tt> element to specify the layout we want.
This
+++ difference is because the "layout based" groups are quite lightweight, while the
+++ "type based" groups are more sophisticated and usually contains other groups.
+++ </p>
+++ 
+++ <h2>Layout groups</h2>
+++ 
+++ <p><tt>&lt;fi:group layout="column"&gt;</tt> will format its
items in a single
+++ column. One row will contain the label, the following row the input field.</p>
+++ 
+++ <p><tt>&lt;fi:group layout="columns"&gt;</tt> will format its
items in two
+++ columns. For each item a row is created, the first column will contain the
+++ label, and the second column the input field.</p>
+++ 
+++ <p><tt>&lt;fi:group layout="row"&gt;</tt> will format its items
in a single row.
+++ One cell will contain the label, the following cell the input field.</p>
+++ 
+++ <p><tt>&lt;fi:group layout="rows"&gt;</tt> will format its items
in two rows.
+++ The first row will contain all the labels, one each cell, the second row all the
+++ input fields, again one each cell.</p>
+++ 
+++ <p>Some input fields will have a special layout when inside a certain group :
+++ </p>
+++ 
+++ <ul>
+++ <li><tt>action</tt>, <tt>submit</tt> and <tt>boolanfield</tt>
widgets does not
+++ have a "label" which can be displayed separated from the button or checkbox
+++ itself, so they will be placed</li>
+++ <ul>
+++ <li>in a single line inside the <tt>column</tt> and <tt>columns</tt>
layout</li>
+++ <li>using only one cell in <tt>row</tt> layout</li>
+++ <li>using an empty cell in the first row of a <tt>rows</tt> layout</li>
+++ </ul>
+++ 
+++ <li><tt>multivaluefield</tt> with a <tt><tt>list-type="double-listbox"</tt></tt>
+++ will be displayed with a row with a label and another row with the two lists
+++ when in a <tt>columns</tt> group.</li>
+++ <li>every other <tt>fi:group</tt> nested inside a <tt>fi:group</tt>
with layout
+++ <tt>columns</tt> will span on both columns</li>
+++ </ul>
+++ 
+++ <p>Also layout <tt>fi:group</tt> can contain other <tt>fi:group</tt>
between
+++ their items, and can be used to create quite complex layouts.</p>
+++ 
+++ <h2>Type groups</h2>
+++ 
+++ <p>There are currently two "type" groups : <tt>tabs</tt> and <tt>choice.</tt>
+++ </p>
+++ 
+++ <p>The tabs group will display some tabs, every tab is (usually) a fi:group. For
+++ example :</p>
+++ 
+++ <pre>&lt;fi:group&gt;
+++   &lt;fi:styling type="tabs"/&gt;
+++   &lt;fi:items&gt;
+++     &lt;fi:group&gt;
+++       &lt;fi:label&gt;Personal info&lt;/fi:label&gt;
+++       &lt;fi:styling layout="columns"/&gt;
+++       &lt;fi:items&gt;
+++         &lt;ft:widget id="name"/&gt;
+++         &lt;ft:widget id="surname"/&gt;
+++       &lt;/fi:items&gt;
+++     &lt;/fi:group&gt;
+++     &lt;fi:group&gt;
+++       &lt;fi:label&gt;Iternet data&lt;/fi:label&gt;
+++       &lt;fi:styling layout="columns"/&gt;
+++       &lt;fi:items&gt;
+++         &lt;ft:widget id="email"/&gt;
+++         &lt;ft:widget id="icqaccount"/&gt;
+++       &lt;/fi:items&gt;
+++     &lt;/fi:group&gt;
+++   &lt;/fi:items&gt;
+++ &lt;/fi:group&gt;</pre>
+++ 
+++ <p>Will display two tabs, one called "Personal info" and the other one "Internet
+++ data". When the user clicks on "Personal info" the field name and surname will
+++ be displayed, while when the user clicks on "Internet data" the field email and
+++ icqaccount will be displayed.</p>
+++ 
+++ <p>You can specify a widget that will be used to store and retrieve which tab is
+++ curently active. This way you can control from the flow which tab will be active
+++ when the form will be displayed, or check which tab was active when the user
+++ submitted the form. To specify this special field use :</p>
+++ 
+++ <pre>&lt;fi:group&gt;
+++   &lt;fi:styling type="tabs"/&gt;
+++   &lt;fi:state&gt;
+++     &lt;ft:widget id="activetab"/&gt;
+++   &lt;/fi:state&gt;
+++   ....
+++ &lt;/fi:group&gt;</pre>
+++ 
+++ <p>Obviously you can call the widget whatever you want, and the suggested
+++ datatype is integer, since the field will contain a number indicating the active
+++ tab, the field must be declared in the definition, and can be used in binding if
+++ needed. For example :</p>
+++ 
+++ <pre>&lt;fd:field id="activetab"&gt;
      &lt;fd:datatype base="integer"/&gt;
    &lt;/fd:field&gt;</pre>
    
--- <p>Bind this value to whatever you want. In the form template you need then
--- following code:</p>
+++ <p>The group of type <tt>choice </tt>is identical to the <tt>tabs</tt>
group,
+++ but instead of a row of tabs, a drop down is displayed, and selecting one
+++ element of the drop down will display the relative group.</p>
    
+++ <p>You can specify a client side javascript that will be executed when a tab is
+++ clicked or when an option of the <tt>choice</tt> drop down is selected. This
is
+++ done simply adding an attribute to the items of the group, for example :</p>
+++ 
    <pre>&lt;fi:group&gt;
---   &lt;fi:styling type="choice"/&gt;
---   &lt;fi:state&gt;
---     &lt;ft:widget id="state"/&gt; &lt;!-- refering to the above defined field
--&gt;
---   &lt;/fi:state&gt;
---   &lt;fi:items&gt;
---     ...
---   &lt;/fi:items&gt;
+++   &lt;fi:styling type="tabs"/&gt;
+++   &lt;fi:items&gt;
+++     &lt;fi:group formsOnShow="personalSelected()"&gt;
+++       &lt;fi:label&gt;Personal info&lt;/fi:label&gt;
+++       ...
+++     &lt;/fi:group&gt;
+++     &lt;fi:group formsOnShow="internetSelected()"&gt;
+++       &lt;fi:label&gt;Iternet data&lt;/fi:label&gt;
+++       ...
+++     &lt;/fi:group&gt;
+++   &lt;/fi:items&gt;
    &lt;/fi:group&gt;</pre>
    
+++ <p>Have a look at <tt>forms-page-styling.xsl</tt> , all <tt>fi:groups</tt>
are
+++ formatted there.</p>
+++ 
    <h1>Miscellaneous</h1>
    
    <h2>fi:validation-errors</h2>
(17 equal lines skipped)


Fields
======
no changes

Links
=====
no changes

Custom Fields
=============
no changes

Collections
===========
no changes

Mime
View raw message