From: David H. <pro...@ma...> - 2008-11-04 17:49:46
|
Thanks for this Anjo. Makes a number of things much clearer. Which doesn't necessarily mean clear ;-) You guys are code chefs. I think I'm a line cook: I just bought "A day at el Bulli" so the cooking metaphor seems appropriate (not to mention we're talking bread crumbs here ;-) <http://www.amazon.com/Day-At-Elbulli-Albert/dp/0714848832/> David On 3-Nov-08, at 8:09 PM, Anjo Krank wrote: > > Am 04.11.2008 um 04:26 schrieb Anjo Krank: > >> I admit the bug tracker is >> a bit confusing... it was the implementation of an idea I had for >> exactly the reason I a) didn't want to push the context state because >> of the tab issue. > > I edited this out int first post: "and b) didn't want to write > rules like 'page config=bla => navState=blub'". But in fact there > are some of these rules in bug tracker, so thought I'd confuse you > a bit more by explaining what is behind all that:) > > One could safely remove the rules, as the state is pushed into the > page's d2w context by this code: > > public class Session extends ERXSession { > public class Handler implements NSKeyValueCoding, > NSKeyValueCoding.ErrorHandling { > ... > public Object valueForKey(String key) { > String keyPath = ERXStringUtilities.uncapitalize(key); > WOActionResults result = (WOActionResults) > NSKeyValueCoding.DefaultImplementation.valueForKey(this, keyPath); > if (result instanceof D2WPage) { > D2WPage page = (D2WPage) result; > String state = ERXStringUtilities.capitalize(_key) > + "." + key; > page.d2wContext().takeValueForKey(state, > "navigationState"); > } > return result; > } > public Object handleQueryWithUnboundKey(String key) { > return NSKeyValueCoding.Utility.valueForKey > (Factory.bugTracker(), key); > } > ... > public Session() { > super(); > new ReleaseHandler(); > new BugHandler(); > ... > > what happens here: > > - user clicks item > - item has "action = session.handlers.reports.BugsPerComponent" in it > - item calls up session.handlers.handlers.reports, which returns > the ReportHandler > - KVC on it with "BugsPerComponent" transforms the key to > "bugsPerComponent" > - calls default KVC imp, which looks for "bugsPerComponent()" and > if not found > - calls handleQueryWithUnboundKey which routes it to the bug > tracker factory for "bugsPerComponent()" > - which return a page > - to where the nav state "Reports.BugsPerComponent" is set into the > page's d2w context (which could also be a variable > "navigationState" on the page) > - menu pulls the navigationContext from the menu header, which > returns the d2w context, which returns "Reports.BugsPerComponent" > when asked. > - profit > > Again, I'll admit that the bug tracker is a bit confusing, but it > *does* spare you a ton of work as opposed to the traditional approach. > > The net effect of all this is that you can easily add sub menues or > sub items, by only adding a three-line handler class and/or > implement the code that actually creates the page. You needn't > route through a factory, but you could easily implement > bugsPerComponent() in the handler class itself, which would > partition the code a bit better. Also, this approach is very direct > action friendly and you could create a DA like: > > public Nav extends WODirectAction { > public String performActionNamed(String name) { > return session().valueForKeyPath("handlers."+name); > } > } > > then change your item to "directAction = reports.BugsPerComponent; > directActionClass=Nav;" and presto... instant DA navigation with > bookmark-able links (access control would be advised). > > This whole trick works because the nav items are displayed via the > localizer, which makes it possible to display "By Component" for > "BugsPerComponent" so you can use KVC compatible keys. > > Cheers, Anjo > > |