Thanks Matt, for that insightful response.
I have decided after all to go with the XTile component. I guess I
had been leaning towards using EventListener, since that seemed the
way of the future, and a way to consolidate all the different AJAX
approaches out there. I find it interesting that your refer to it as
cruft :-) With XTile, the logic is fairly obvious, and thus
maintainable, and the porting is quite easy, requiring only minimal
modifications to the existing javascript, so it seems like the best
solution in this case.
Thanks again,
J
On 13-Feb-07, at 10:44 PM, Matt Brock wrote:
That's a very nice little widget there.
This would be very easy to move to the Tapestry world. I guess it
would
really depend on how much you want to keep on the client side, and
how much
would have to be done on the server. For instance, a good
implementation
might render the page with the items already generated for a
particular day.
Alternatively, you could first render the day planner completely
empty, then
do an Ajax call to populate the day once the page is loaded. It
really
doesn't matter.
Julian Wood wrote:
The javascript has many event hooks which fire off AJAX requests
to it's
PHP backend.
It looks like there's basically just one event (let's call it
updateEvent),
fired in a lot of different ways. updateEvent takes a few different
parameters, but they're all the same no matter what the event
actually is.
You could do all this using a single listener, which then parses it
out and
stores the information however you like and has a simple return
code if
there's an exception thrown, or if there's a date conflict... you
can make
it as smart or dumb as you want.
I'll also need to put in raw URL's to the AJAX services, directly
inside the
javascript.
Have you looked at the XTile component? It's got basically
everything you
need. There's really not much *to* Ajax, which is why I find all
the new
bells and whistles of 4.1 essentially cruft considering all you're
doing is
calling a page listener and maybe receiving return data to the client.
So if I can dip into specifics, I know I can get the planner to
load all the
"appointments" for a week pretty easily. But how to deal with an
appointment
move? A resize (change in duration)? A delete? A double click for
an edit?
I'd need to understand better how your event objects are
represented in
Javascript first and I didn't want to trudge through source code. I'm
guessing that each event has a unique ID, a start and end time, a
date and
some text to go along with it. Something like:
var Events = {
elements: {},
eventObj: function(start, end, date, text) {
this.start = start;
this.end = end;
this.date = date;
this.text = text;
},
add: function(id, start, end, date, text) {
Events.elements[id] = new Event.eventObj(start, end, date,
text);
},
delete: function(id) {
delete Events.elements[id];
},
update: function(id, start, end, date, text) {
Events.elements[id].start = start;
Events.elements[id].end = end;
Events.elements[id].date = date;
Events.elements[id].text = text;
}
}
There's all your event objects on the client side and all your basic
methods. In your page file add the XTile component from the Contrib
library. It's dead-simple to configure. You just give it a Send
function,
a Receive function, and a page Listener.
For instance, in your HTML...
<span jwcid="@contrib:XTile" sendName="literal:updateEvent"
receiveName="literal:recvResponse"
listener="listener:handleRequest" />
The send function is the function you call from the client side
when you
want to instantiate the Ajax request. So when you move a calendar
event and
the date changes, you'd call the update function and pass all the
Event
object elements. Something like,
onWhateverEvent = function() {
var id = // get the id however you like...
updateEvent(id, Events.elements[id].start, Events.elements[id].end,
Events.elements[id].date, Events.elements[id].text);
}
In your java code, you'll have a listener that then does something
with this
info...
public void handleRequest(IRequestCycle cycle) {
String[] ret = null;
Object[] params = cycle.getListenerParameters();
if (params.length < 5)
return;
String id = params[0].toString();
String start = params[1].toString();
String end = params[2].toString();
String date = params[3].toString();
String text = params[4].toString();
// save the updated object
// ret == return message
cycle.setListenerParameters(ret);
}
Then in your javascript you'll need a function to handle the return
data...
function recvResponse(xmlstuff) {
var returnData = xmlstuff.join('');
// do stuff...
}
And that's basically it. If you wanted to be clever, you could use
JSON to
transport your javascript objects. If you wanted to be very
clever, you
could add an additional "action" parameter to your Ajax request to
make
coding the listener a bit easier (stuff like "ADD" or "DELETE" or
"EDIT").
--
View this message in context: http://www.nabble.com/Best-strategy--
tf3201900.html#a8959162
Sent from the Tapestry - User mailing list archive at Nabble.com.
-
Julian Wood <[EMAIL PROTECTED]>
Software Engineer
Teaching & Learning Centre
University of Calgary
http://tlc.ucalgary.ca