Ben Pope писал(а):

Try the following approach.

In sitemap you use xinclude transformer. Each room element contains
<xi:include href="#xpointer(some_XPath)"/> elements.
<rooms>
<room id="0">
<name>Lounge</name>
<xi:include
href="#xpointer(/project/people/person[2])"/>
<xi:include
href="#xpointer(/project/people/person[3])"/>
</room>
<room id="1">
<name>Kitchen</name>
<xi:include
href="#xpointer(/project/people/person[1])"/>
</room>
</rooms>


Form and binding may be like this (I don't if it works):
<fd:form
xmlns:fd="http://apache.org/cocoon/forms/1.0#definition";
xmlns:i18n="http://apache.org/cocoon/i18n/2.1";>
<fd:repeater id="people">
<fd:widgets>
<fd:output id="id">
<fd:datatype base="long"/>
</fd:output>
<fd:output id="href">
<fd:datatype base="string"/>
</fd:output>
<fd:booleanfield id="select">
<fd:label>Select</fd:label>
</fd:booleanfield>
</fd:widgets>
</fd:repeater>


<fd:repeater-action id="addperson" action-command="add-row"
repeater="contacts">
<fd:label>Add</fd:label>
</fd:repeater-action>


<fd:repeater-action id="removeperson" action-command="delete-rows"
repeater="contacts" select="select">
<fd:label>Remove</fd:label>
</fd:repeater-action>
</fd:widgets>
</fd:form>


<fb:context
xmlns:fb="http://apache.org/cocoon/forms/1.0#binding";
xmlns:fd="http://apache.org/cocoon/forms/1.0#definition";
xmlns:xi="http://www.w3.org/2001/XInclude";
path="/project/rooms/room[1]" >
<fb:repeater id="people"
parent-path="people"
row-path="xi:include">


<fb:identity>
<fb:value id="id" path="@id">
<fd:convertor datatype="long" />
</fb:value>
</fb:identity>


<fb:on-bind>
<fb:value id="href" path="@href" />
</fb:on-bind>


<fb:on-delete-row>
<fb:delete-node />
</fb:on-delete-row>


<fb:on-insert-row>
<fb:insert-node>
<xi:xinclude id="" href=""/>
</contact>
</fb:insert-node>
</fb:on-insert-row>
</fb:repeater>


</fb:context>

Hi,

I don't seem to be able to get my head around binding cross-referenced data
- the example below will be clearer than I can explain it in words:


Say I want to store some information about who is in what room, I might have
a data file that looks like this:


<project>
<people>
<person id="0">
<name>Me</name>
<mentalAge>9</mentalAge>
</person>
<person id="1">
<name>You</name>
</person>
<person id="2">
<name>Him</name>
</person>
</people>
<rooms>
<room id="0">
<name>Lounge</name>
<person idref="0"/>
<person idref="1"/>
</room>
<room id="1">
<name>Kitchen</name>
<person idref="2"/>
</room>
</rooms>
</project>



Now each room has a person reference that references the person id. So
"You" and "Me" are in the Lounge and "Him" is in the Kitchen (hopefully
making some food 'cos this is making me hungry!).


I'd like to do this:

http://localhost/cocoon/rooms/room?room=0

And be able to get back a form with a repeater over all the people in that
room.


The definition for said form might look like this:

<?xml version="1.0"?>
<fd:form xmlns:fd="http://apache.org/cocoon/forms/1.0#definition";>
<fd:widgets>
<fd:field id="roomName" required="true"/>
<fd:repeater id="people">
<fd:widgets>
<fd:field id="personName" required="true"/>
<fd:booleanfield id="select"/>
</fd:widgets>
</fd:repeater>
<fd:repeater-action id="addPerson" repeater="people"
action-command="add-row"/>
<fd:repeater-action id="removePeople" repeater="people"
action-command="delete-rows" select="select"/>
</fd:widgets>
</fd:form>


So I would like to be able to add and remove people from a particular room -
it's safe to assume that the person already exists, so I wouldn't be adding
a people/person at any time, only a room/person. But I would like to be
able to manipulate their name.


I can't establish what the binding file would look like given the above data
file with the cross-referencing.


Should I be running an XSLT over the data so that for room 0 I end up with:
<room id="0">
<name>Lounge</name>
<person id="0">
<name>Me</name>
</person>
<person id="1">
<name>You</name>
</person>
</room>


Which would be much easier (with my mind, at least) to create a binding file
for.


If so... How do I fit that back into the old data file, retaining the
room/person idrefs and updating the people/person elements?


Or can it be done "in place"?

This is all a new paradigm of thinking for me, I clearly haven't had that
click moment, if I keep plugging at it and seeing the solutions to my
problems it will click, I know it.


Any help is much appreciated.

Ben

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





Timur

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to