Hi,

Others will surely correct me if I'm wrong...
- Ideally you should be able to create a mixin for the onclick event on the actionlink that picks up the value of the textfield and sets the context before the tapestry actionlink event triggers. However since the actionlink is tied to a zone this is not so trivial. Something to do with indeterministic ordering of events in javascript i believe


I can see a couple of other alternatives;
1. Event and a little javascript using prototype and its inbuildt support for ajax requests. Haven't tested the below so a big disclaimer here :-)

A) Sample Javascript - checkusername.js;
CheckUserNameLink.prototype = {
    initialize: function(elementId, requestUrl)
    {
        this.elementId = elementId;
        this.requestUrl = requestUrl;

Event.observe($(this.elementId), 'click', this._click.bindAsEventListener(this));
    },
    _click: function(theEvent)
    {
var url = this.requestUrl + "/" + encodeURIComponent($ ('userName')); // adding the username as a context param to event
        new Ajax.Request(this.requestUrl, {
            method: 'get',
            onSuccess: function(transport) {
                 var isTaken = transport.responseJSON.isTaken;
                if (isTaken === 'true') {
// javascript to tell user the username is take... update a div/ span or whatever
                }
            }
        });
    }
};

B) In your TML
remove the zone/replace with an empty div/span or whatever
<a href="#" id="d="verifyDuplicatedUserName"">${message:verify-username-duplicated-link }</a>


C) In your page class
// above class definition
@IncludeJavaScriptLibrary({"context:js/checkusername.js"})


// inside class body
private static final String CHECK_USER_NAME_EVENT = "checkusername";

@Inject
private RenderSupport renderSupport;

@Inject
private ComponentResources componentResources;

@AfterRender
    void afterRender() {
Link link = componentResources.createEventLink(CHECK_USER_NAME_EVENT); renderSupport.addScript("new CheckUserNameLink('%s', '%s');", "verifyDuplicatedUserName", link.toAbsoluteURI);
    }

@OnEvent(value = CHECK_USER_NAME_EVENT)
 public Object onVerifyUserName(String userName) {
        
        //... do whatever you need to verify if username is taken

        // return result as json
       JSONObject response = new JSONObject();
       response.put("isTaken", isTaken);
       return response;
}


2. Autocomple: You might use the autocomplete mixin for textfield ?
...have to be creative to make it user friendly though ...



cheers
rundis





I'm still getting started with Tapestry by doing some stuff, but... many
questions.

This one is in regards to AJAX. It's a "How to" kinda question.

I Have a form like this in my page.tml:

<form t:type="form" t:id="registrationForm" clientValidation="false">
<t:label for="userName" />

<input t:type="TextField" t:id="userName" value="user.name"
t:validate="required,
maxlength=15, minLength=3" size="15" />
<t:zone t:id="userNameDuplicatedNotice">${userExistMessage}</t:zone>

<a t:type="actionlink" t:id="verifyDuplicatedUserName"
context="literal:testing"
href="#" t:zone="userNameDuplicatedNotice">${message:verify-username-duplicated-link }</a>

<input type="submit" value="${message:label.submit.create.user}" />

</form>

What I'm trying to figure out is: What is the best way to give the current
value of textfield "userName" to the context of the link
"verifyDuplicatedLogin"?

Let me try to express with a user story:

As a user I want to introduce a user name and click in a link to
automatically(AJAX) receive a message informing me if the "userName" is
already taken or not



Thank you,

jp


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

Reply via email to