You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Leszek Gawron <lg...@mobilebox.pl> on 2004/09/13 16:51:20 UTC

CForms and repeater id - a problematic case study

There is one thing that bugs me a lot when dealing with cforms and that is: 
the need for unique repeater id.

Does anyone have a nice solution for something like this:
A form is bound to and O/R managed bean:

class Net {
	private String name;

	// elements of class Depot
	Set depots;
}

depots could be shown using a repeater like this:
<fd:repeater id="depots">
     <fd:label>Hale</fd:label>
     <fd:widgets>
         <fd:output id="id">
             <fd:label>id</fd:label>
             <fd:datatype base="long"/>
         </fd:output>
         <fd:field id="name">
             <fd:label>Name</fd:label>
             <fd:datatype base="string"/>
         </fd:field>
         <fd:submit id="edit-depot" action-command="-">
             <fd:label>edit</fd:label>
         </fd:submit>
     </fd:widgets>
</fd:repeater>

Now you want to add a depot somehow. That's easy - simple fd:submit with 
validate = false. Problem is you have to assign a unique id but you need the 
id to be null so the bean will be persisted as new. You cannot use repeater 
action as this would insert an empty Depot bean into the collection and mess 
everything up.

So you have to:
1. assign a temporal id somehow unique from all existing
2. then remove it (nullify) after form.save and before the bean is persisted

it got really bad:
1. the id has to be somehow different from the "persistent" one ( <0 ? )
2. if you edit a deeper structure nullifying the temporal ids gets really ugly.

Finally: you cannot use simple repeater which will delete and overwrite whole 
collection as this would break database constraints.

Please comment.
-- 
Leszek Gawron                                      lgawron@mobilebox.pl