[Seaside] Getting started
tblanchard@mac.com
seaside@lists.squeakfoundation.org
Sun, 24 Nov 2002 14:09:54 +0100
> Did that all make sense?
Wow. Yes. Thats very cool. So the app is typically structured like a
star with the home page and lots of little forays out to perform
subtasks. Very sensible.
Brief question - the session object - how is access to the current
session made available to the current component? I mean, I see the
session attribute on WAComponent but I don't see where it gets set up.
Time to play...
On Saturday, November 23, 2002, at 11:02 PM, Avi Bryant wrote:
>
> On Sat, 23 Nov 2002 tblanchard@mac.com wrote:
>
>> OK - lets start with creating an application. The config utility has
>> a
>> page, which lets me add an application - I name it and it presents a
>> pair of popup menus. Based on this - I am guessing that there is only
>> one class that is the application - and that this class is configured
>> with a default page (the first popup menu) and you can select a
>> particular type of session type (the second popup menu). The menus
>> are
>> populated as subclasses of WAComponent for the default page and
>> subclasses of WASession for the session class selector.
>
> Correct on all counts.
>
>> So all I have to do is write a WAComponent for the first page of my
>> app, set it as the entry point in config - then use WASession or a
>> subclass of that for the session.
>
> Also correct.
>
>> I think I get that. I'm not quite clear on how to navigate to a new
>> page from there though.
>
> You navigate to a new page by creating an instance of a WAComponent
> subclass and passing it into the #call: method. So, for example, let's
> say you're writing a simple guestbook - it has a default page which
> lists
> the guests, and a link to a page to add a new guest. The first thing
> you
> would do is write the #renderOn: method of the GuestList; somewhere in
> there you would render the "Add Guest" link, which you would attach to
> a
> callback that called, say, the #addGuest method on GuestList. So:
>
> GuestList>>renderOn: html
>
> "render the guest list"
> ...
>
> "render the Add Guest link"
> html anchorWithAction: [self addGuest] text: 'Add Guest'.
>
>
> Ok, now when that link is clicked, #addGuest will be called. That's
> where
> you need to navigate to the AddGuest page. So:
>
> GuestList>>addGuest
> self call: (AddGuest new)
>
> Now, that answers your question, sort of. But let's keep going, and
> look
> at AddGuest. We'll give it an instance variable "guest", and
> initialize it to a new Guest object.
>
> AddGuest>>initialize
> guest := Guest new
>
> The AddGuest page is going to render a form that fills in the fields of
> Guest, and it's also going to have a "Save" submit button.
>
> AddGuest>>renderOn: html
>
> html form: [
> html textInputWithValue: guest name callback: [:n | guest name: n].
> .....
>
> html submitButtonWithAction: [self save] text: 'Save'.
> ]
>
> Now, here's the interesting part: what happens in #save? In
> traditional
> web app terms, we want to navigate back to the GuestList. So, we could
> have something like this:
>
> AddGuest>>save
> ... do something to save the Guest object ..
>
> self call: (GuestList new)
>
> But in Seaside, every "call" to a page can be "answered" - bringing us
> back to the point it was called from. And in fact, it can pass a value
> as its answer, which will be returned from the call; in this case,
> let's
> pass the guest object we just created.
>
> AddGuest>>save
> self answer: guest
>
> Since AddGuest was called from GuestList, by calling #answer: we're
> returning back to the GuestList. But in fact, we're returning back to
> the
> #addGuest method, and we're returning it a Guest object. So in fact
> #addGuest should look like this:
>
> GuestList>>addGuest
> |newGuest|
> newGuest := self call: (AddGuest new).
> guests add: newGuest
>
> Did that all make sense?
>
> Avi
>
> _______________________________________________
> Seaside mailing list
> Seaside@lists.squeakfoundation.org
> http://lists.squeakfoundation.org/listinfo/seaside
>