[Seaside] Making URLs stateful / stateless depending on authentication

Pat Maddox patmaddox at me.com
Thu Oct 7 07:01:00 UTC 2010


On Oct 6, 2010, at 10:56 PM, Philippe Marschall wrote:

> 2010/10/6 Pat Maddox <patmaddox at me.com>:
>> I wrote a little blog app, and for visitors to my site I want the blog to use pretty URLs.  When I use the site though, I want to use Seaside callbacks, so I just have to login once and then click around the page.
>> 
>> I have it all working but wanted to see if folks had suggestions for a better way.  Here's my basic structure:
>> 
>> PBApp is my root component.  It has the basic layout, does the updateRoot, and has a child component that points to the main contents of the page.
>> 
>> The other main components are PBBlog - a view of all the blog posts - and PBBlogPost - the model and view for a single blog post.  PBBlogPost renders its title, and that's where the magic happens.  When I'm not logged in, the url should /be-pretty-like-this but when I am logged in, it's Seaside callbacks.  For the callbacks to work, that means telling PBApp (root component) to change the child component it points to.  I wasn't sure of the best way to do that, but going through the Seaside book a bit more I decided to try out the Announcements framework to decouple them.  So my code looks like this:
>> 
>> PBApp>>initialize
>>        super initialize.
>>        blogRoot := PBBlog new.
>>        self session announcer on: PBLinkClicked do: [ :it | blog := it target ]
>> 
>> (the following PBComponent is just a WAComponent subclass that my other components inherit from, to share methods)
>> 
>> PBComponentrenderBlogLinkOn: html with: linkText targeting: aComponent
>>        self session isAuthenticated
>>                ifTrue: [ html anchor
>>                        callback: [ self session announcer announce: (PBLinkClicked targeting: aComponent)  ];
>>                        with: linkText ]
>>                ifFalse: [ html anchor url: aComponent blogUrl; with: linkText ]
>> 
>> My PBLinkClicked Announcement subclass just carries the component that was targeted.
>> 
>> So you can see what's going on...when we're not authenticated, create a basic HTML <a> tag with the href pointing to a path generated by the component (I have an initialRequest which parses the URL to see if it matches a blog post).  When we are authenticated, use a Seaside callback to announce that this component's link was clicked, which causes the root component to swap it out for viewing.
>> 
>> I'm just looking for some feedback at this point.  What do you guys think?  Is there a more straightforward way to approach this?
> 
> Kinda depends why you're doing it. You already have a session, so you
> don't gain much. OTOH Google and friends get bookmarkable URLs. Then
> again it would probably be nice if you didn't lose them, just because
> you logged in.

Oh I don't care about the pretty URLs when I'm logged in.  That's just for me to make posts and preview and publish them.  Plus in the page I render a permalink so I can get that if necessary.

Pat


More information about the seaside mailing list