[Seaside] Backtracking within tasks using continuations
wagwilk at telusplanet.net
wagwilk at telusplanet.net
Tue May 29 22:33:20 UTC 2007
This is sort of an observation/question post -- should be interesting to some,
strange and obtuse to others. I appologize if I confuse people with my rambling.
Okay, to date I've made a very slick navigation interface for my Seaside webapp
using a WAPath to 'bookmark' the users progress within a WATask. My WATask
produces continuation objects, which it adds to the WAPath, and these allow the
user to step backwards in the WATask progression.
Clear? In brief the user gets a navigation path that represents his path through
a WATask.
I.e.
Select View >> Custom View >> Report Results (if the user selects and builds a
Custom view)
Select View >> Report Results (if the user selects a prefab view)
The WATasks go method is included at the end of this post if it helps you to
understand what I mean.
This navigation method works flawlessly IF, and only IF, all the continuations
placed on the path are produced only within the WATasks method (i.e. -- if you
invoke a subtask, any anchors it adds to the path become invalidated once the
subtask answers.
Originally, I had thought that this had something to do with answer
continuations from seaside, somehow surviving with the subtask and causing the
subtask to return immediately again once I'd invoked a continuation that would
return us to within that subtask -- but now I think the problem is much simpler:
Since subtasks involve a call/answer method using continuations, once you invoke
that answer continuation, its like you never made the call in the first place --
so my continuation produced by the subtask probably gets garbage collected.
If this is the case, that kind of sucks (in a program compositional way), since
I can't split my task into reusable subtasks and still use this navigational
methodology (and this navigational methodology is really too awesome for words)
-- UNLESS there is a way to call/answer from one task to a child task without
using continuations.
So my question is: "Is there a way for one WATask to use another WATask without
using call/response?", and also "Is my conclusion in the previous previous
correct -- is my inner task continuation being invalidated by the overarching
call/answer continuation invokation?"
(go method follows signature)
Cheers,
Warren Wilkinson
go
| reader filter mypath collection |
mypath := self path.
self path empty.
filter := self call: (Continuation currentDo: [:nextStep |
mypath pushSegment: (Array with: nextStep with: [BMViewList new path: self
path; yourself]) name: 'Select Filter'.
nextStep value: (BMViewList new path: self path; yourself).]).
"No filter given, so use must have clicked Custom Filter."
filter = nil ifTrue: [
filter := self call: (Continuation currentDo: [:nextStep |
mypath pushSegment: (Array with: nextStep with: [(EmployeeReportRequirements
new asComponent) addValidatedForm; yourself]) name: 'Custom Filter'.
nextStep value: ((EmployeeReportRequirements new asComponent)
addValidatedForm; yourself).]).
].
"Still no filter, user must have canceled custom filter"
filter = nil ifTrue: [^nil].
"Generate a reader for filtered data."
collection := self session root at: 'survey'.
reader := BMUtil createFilteredReaderFromCollection: collection filters: filter.
self call: (Continuation currentDo: [:nextStep |
mypath pushSegment: [nextStep value: (BMViewComponent new reader: reader)]
name: 'Results'.
nextStep value: (BMViewComponent new reader: reader)]).
More information about the seaside
mailing list