Hi,

 

I would like to post an alternate way of generating suggestion lists. In our current project we had the need of generating context-sensitive suggestion-lists.

Next to the context sensitivity, there were other things bothering us. While debugging everything we had a look at what was actually happening:

 

-          When the pipeline for generating the suggestion-list is called,

o        the suggestion-list generator looks up the form and widget

o        the corresponding java-script block is executed on the widget:

§         Since the content of the suggestion-lists is the result of an xquery, the first step was to do an xquery

§         The result of the xquery pipeline was loaded into a dom

§         that is walked through generating an array, which is returned to the suggestion-list generator

o        that array is transformed to sax-events by the suggestion-list generator

o        this sax stream is then flattened back to plain old ASCII text in the usual pipeline definition for suggestion lists

 

A conversion nightmare.

 

After quite some time of trying we found a way simplifying the way suggestion-lists content is generated and as an addition we get the benefit of being able to generate context-sensitive suggestion-lists very easily:

 

The pipeline for generating the content:

                  <!-- Pipeline for creating the suggestion list content.

                        the parameter "filter" contains the current content of

                        the text field and "widget" the id of the currently active

                        widget. These are used in the initial xslt generating the

                        query. -->

                  <map:match pattern="_cocoon/forms/suggest">

                        <!-- generate an xml stream of the current form model with

                        element name set to the id of a widget and it's content to

                        the value. I had to use this, because otherwise it was not

                        possible to create suggestion-lists that are context

sensitive. -->

                        <map:generate type="forms-content"/>

                        <!-- prepare a database-query using the current form values

This is where the real logic is set … using request-parameters

For individual xslts depending on the widget id are also

possible -->

                        <map:transform type="xslt-saxon" src="selection-lists/suggestion-list-query.xslt"/>

                        <!-- execute the query -->

                        <map:transform type="sql"/>

                        <!-- thransform the query results to a SELECTION-LIST (not

                        a suggestion-list) -->

                        <map:transform type="xslt-saxon" src="selection-lists/suggestion-list-trans.xslt"/>

                        <!-- transform the selection-list to the primitive array-form

                        the dojo component can operate on -->

                        <map:transform

                             src="resource://org/apache/cocoon/forms/resources/selection-list2json.xsl"/>

                        <!-- send it back as text -->

                        <map:serialize type="text"/>

                  </map:match>

 

 

Widget definition (As you can see … there is no difference between a simple text-field and a suggestion-list):

            <fd:field id="lad_plz" required="">

                  <fd:label>PLZ:</fd:label>

                  <fd:datatype base="string"/>

                  <fd:validation>

                        <fd:length max="6">

                             <fd:failmessage>Die PLZ darf nur 6 Buchstaben enthalten.</fd:failmessage>

                        </fd:length>

                  </fd:validation>

            </fd:field>

 

 

Widget template:

            <ft:widget-label id="lad_land" type="suggest"/>

 

The logic for generating the suggestion-list content is now wrapped up in the selection-lists/suggestion-list-query.xslt query.

It was much easier understanding suggestion-lists this way.

 

Just wanted to share my ideas and maybe get some hints for improvements.

 

Regards,

Chris

 

[ c h r i s t o f e r   d u t z ]

 

IT-Berater

univativ GmbH & Co. KG

Robert-Bosch-Str. 7, 64293 Darmstadt

 

fon: 0 61 51 / 66 717 - 21

fax: 0 61 51 / 66 717 - 29

email: [EMAIL PROTECTED]

http://www.univativ.de

 

Darmstadt, Stuttgart, Karlsruhe, Düsseldorf

 

 

Reply via email to