Wow, you really saved my day !
Thanks !
El 17/02/2010, a las 23:09, Josh Canfield escribió:

> The problem is that you really only have one instance of the Form
> component, and so only one instance of the ValidationTracker. I poked
> around and wasn't able to find an easier way to do this.
> 
> Don't use ${} when passing the context.
>        <t:form t:id="edit" clientValidation="false" context="message.id">
> 
> I used the index of the loop for the context. You can modify to use
> the message.id
> 
>    @Component(parameters = {"tracker=tracker"})
>    private Form _edit;
> 
>    @Persist(PersistenceConstants.FLASH)
>    private Map<Integer, ValidationTracker> _indexedTrackers;
> 
>    /**
>     * Holds the tracker created when the form is posted and we don't
> know which form is being processed
>     */
>    private ValidationTracker _tmpTracker;
> 
> @OnEvent(EventConstants.PREPARE_FOR_SUBMIT)
>    void onPrepareForSubmitFromEdit(int index) {
>        _formIndex = index;
>    }
> 
> @OnEvent(value = EventConstants.VALIDATE_FORM)
>    void validateForm() {
> // don't clear the errors here. Clear them after render, otherwise you
> lose edited value tracking
>        if (name == null) {
>            _edit.recordError("Sorry, name is mandatory");
>        }
>    }
> 
> public ValidationTracker getTracker() {
>        if (_indexedTrackers == null) _indexedTrackers = new
> HashMap<Integer, ValidationTracker>();
>        if (_formIndex == null) {
>            // it's a post and we haven't gotten to the part of the
> action where the fields are processed
>            if (_tmpTracker == null) _tmpTracker = new ValidationTrackerImpl();
>            return _tmpTracker;
>        }
>        if (_tmpTracker != null) {
>            // We have a temp tracker and a form index so we have now
> processed the input fields
>            // so we can store the temp in the map and clear it.
>            _indexedTrackers.put(_formIndex, _tmpTracker);
>            _tmpTracker = null;
>        }
> 
>        // Make sure we have a tracker for all the forms
>        if (_indexedTrackers.get(_formIndex) == null)
> _indexedTrackers.put(_formIndex, new ValidationTrackerImpl());
> 
>        return _indexedTrackers.get(_formIndex);
>    }
> 
>    public void setTracker(ValidationTracker tracker) {
>        if (_indexedTrackers == null) _indexedTrackers = new
> HashMap<Integer, ValidationTracker>();
>        if (_formIndex == null) {
>            // We don't know which form this is for. This gets called
> at the very end of the action
>            // so you probably have a bug if this is getting called
>            throw new RuntimeException("This shouldn't happen");
>        }
>        _indexedTrackers.put(_formIndex, tracker);
> // Remember the trackers for the render.
>        setIndexedTrackers(_indexedTrackers);
>    }
> 
>    public void setIndexedTrackers(Map<Integer, ValidationTracker>
> indexedTrackers) {
>        _indexedTrackers = indexedTrackers;
>    }
> 
> 
> 
> On Wed, Feb 17, 2010 at 9:16 AM, Jose Luis Sanchez
> <joseluis.sanc...@m-centric.com> wrote:
>> Hi all.
>> 
>> I have a multiple form problem .. and after having search and thought many
>> on this, can't find a solution.
>> 
>> 
>> <table t:type="loop" t:source="receivedMessages" t:value="message" >
>> <tbody>
>> <tr style="horizontal-align: middle">
>> <td style="vertical-align: top; horizontal-align: middle width: 323px;">
>> <form t:type="form" t:id="edit" context="${message.id}"
>> clientValidation="false">
>> </t:errors>
>> <input t:type="textfield"    t:id="phone" />
>> <input    value="Save"   t:id="save"   t:type="submit" />
>> <input    value="Reject" t:id="reject" t:type="submit" />
>> </form>
>> </td>
>> </tr>
>> </tbody>
>> </table>
>> 
>> 
>> Well, that's a sample of what i have.
>> 
>> I'll tell my usage :
>>  When the user clicks Reject, no clientValidation is done. That's why i
>> disabled clientvalidation.
>>  When the user clicks Accept, serverside validation is done against real
>> required fields, but as the form id
>>  is inside a loop, i can't get the validation to show the errors in it's own
>> form.
>> 
>> 
>>    private Form edit;
>> 
>>    @OnEvent(value=EventConstants.VALIDATE_FORM)
>>    void validateForm() {
>>        edit.clearErrors();
>>        if (phone==null) edit.recordError("Sorry, phone is mandatory");
>>    }
>> 
>>    While this works, it shows errors on every form ( currently 3 form ), so
>> i see the famous red-banner thrice.
>> 
>> 
>> 
>> 
>> I can't add edit_0 nor edit_1, because while they are real names in rendered
>> tml, they are not before, so tapestry gives me an error.
>> 
>> Is there any way i can fix this ?
>> 
>> Thanks.
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>> For additional commands, e-mail: users-h...@tapestry.apache.org
>> 
>> 
> 
> 
> 
> -- 
> --
> http://www.bodylabgym.com - a private, by appointment only, one-on-one
> health and fitness facility.
> --
> http://www.ectransition.com - Quality Electronic Cigarettes at a
> reasonable price!
> --
> TheDailyTube.com. Sign up and get the best new videos on the internet
> delivered fresh to your inbox.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to