|
Hi cocooners,
I posted this question to the users-list earlier
but got no response sofar. Perhaps it is more a dev-list question, because it is
about a possbile bug, or feature, and a fix.
I'm relatively new to Cocoon and have been
struggling to get the CForms framework (it's great!) to work with the embedded
xindice database to load and save data for the form. I've solved this problem
thanks to one message I found (can't find it right now) that said to use the
JXPath engine to insert the DOM-tree in the XML pipeline using <jx:out
value="#{dom/*}"/> where 'dom' is the (DOM-) document that comes out of the
CForms framework. When you have your XML-document in the pipeline again you can
use Xupdate to save it back to the xindice database.
So that works and it's great! But I had one small
problem. When I defined a boolean value in my form it was saved as:
<mail>
<spam-me-baby value="true"/>
</mail> but when I requested the form again I got the
error
'Cannot set value of boolean field "spam-me-baby"
to a non-Boolean value.'
I suspected that getting the value from the xindice
db would be different (i.e. String) than getting the value from a bean (i.e.
Boolean) for instance. I fixed it by editing the file
src/blocks/forms/java/org/apache/cocoon/forms/formmodel/BooleanField.java.
I inserted the following code in the function
setValue, just after the check (object == null):
if
(object instanceof String)
{
object = new Boolean((String) object); } That solved the problem, but now I have a few
questions.
1 Was my assumption about the
datatype of the value from xindice vs. bean correct?
2 Is my fix correct? (I think
there's probably a more elegant way ;-) )
3 Is the described behaviour a
bug or a feature? In other words, did I fix something (and will it
still be fixed in the next release?) or haven't I understood how to use the
boolean in a CForm?
The relevant parts of my CForms-definitions
are:
*** In the form-definition XML file:
***
<fd:booleanfield id="spam-me-baby"> <fd:label><i18n:text key="account_info-field-spam_me_baby">hou mij op de hoogte</i18n:text>:</fd:label> </fd:booleanfield> *** In the binding XML file: *** <fb:context xmlns:fb="http://apache.org/cocoon/forms/1.0#binding"
xmlns:fd="http://apache.org/cocoon/forms/1.0#definition" path="/db:results/db:result/user" > ..... <fb:value id="spam-me-baby" path="personal/preferences/mail/spam-me-baby/@value"
/>
*** Generating the XML input: ***
<map:call
function="handleForm">
<map:parameter name="function" value="account2xml"/> <map:parameter name="form-definition" value="forms/account.xml"/> <map:parameter name="bindingURI" value="forms/binding/account-bind.xml"/> <map:parameter name="documentURI" value="xmldb:xindice-embed:///db/god/#//users/[EMAIL PROTECTED]'{ID}']" /> </map:call> (The {ID} comes from the authentication-fw)
*** Saving the XML output: ***
in account.js:
// save the DOM-tree back to XML using the JXPath framework cocoon.sendPage("account-success-pipeline", { "dom":document } ); in the sitemap (internal call):
<map:generate type="jx"
src="">
<map:parameter name="lenient-xpath" value="true"/> </map:generate> jx/account-success-pipeline.jx contains:
<jx:out
value="#{dom/*[local-name()='results']/*[local-name()='result']/*}"/>
and then xupdate is used to save the XML back to the embedded xindice
database.
Regards and many thanks for any answers! Huib.
|
