Here's an app that does what I believe is trying to be done: // Page public class News { @Property private Integer _newsId; public void onActivate(Integer newsId) { _newsId = newsId; } public Integer onPassivate() { return _newsId; } }
// Page Template <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> <body> <t:newsQuote newsId="newsId" /> </body> </html> // Component public class NewsQuote { @Parameter private Integer _newsId; @Inject private ComponentResources _resources; void beginRender(MarkupWriter writer) { writer.element("ul"); for (int i = 0; i < 5; ++i) { writer.element("li"); Link link = _resources.createActionLink("show", false, i); writer.element("a", "href", link.toURI()); writer.write("News number " + i); writer.end(); if (_newsId != null && _newsId.equals(i)) { writer.write(" You picked " + _newsId); } writer.end(); } writer.end(); } // The Action handler void onShow(Integer id) { // stored into the bound parameter, feeding it back into the page _newsId = id; } } The url http://localhost:8080/news/4 Renders <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link href="/assets/tapestry/default.css" rel="stylesheet" type="text/css"> </head> <body> <ul> <li><a href="/news.newsquote:show/0?t:ac=4">News number 0</a></li> <li><a href="/news.newsquote:show/1?t:ac=4">News number 1</a></li> <li><a href="/news.newsquote:show/2?t:ac=4">News number 2</a></li> <li><a href="/news.newsquote:show/3?t:ac=4">News number 3</a></li> <li><a href="/news.newsquote:show/4?t:ac=4">News number 4</a> You picked 4</li> </ul> </body> </html> Josh On Wed, Apr 30, 2008 at 2:49 PM, Chris Lewis <[EMAIL PROTECTED]> wrote: > I do hope we've missed a simpler way, but I don't think it's surfaced > yet. Regarding parameters, how would that address the issue? NewsQuote > displays a collection of items as links that represent selectable items > (expressed as links). The action must be taken based on the user's > selection, so a component parameter doesn't apply here. > The event-based approach seems a theoretical perfect fit, but I can't > see how to do it without using @Persist (which Janos wants to avoid). > The only other thing I thought of is to have the NewsQuote component > generate pagelinks based on the containing page instead of action links. > This circumvents entirely the need for the events as the value will be > in the page context, does not not make 2 requests, and ultimately gets > the job done. It doesn't seem as elegant to me, but does the job and is > completely decoupled from the page. > > Still not sure if we've had our epiphany yet :-) > > chris > > > Josh Canfield wrote: > >> I mean really, how is that any simpler than > >> dealing directly with query parameters? > >> > > > > Hehe... I have to admit that I was solving a much more complicated > > problem than the original question, probably brought on by an earlier > > request about dynamic component rendering... I was shooting for > > completely decoupled context handling for an unknown assortment of > > components. Say you have 50 potential portlet components on a page > > that may get included multiple times and may or may not add to the > > context of the page, you probably don't want to manage that through > > individual page properties. > > > > Anyway, > > Isn't the straight forward solution to this problem to use component > > parameters as Joel pointed out? If your NewsQuote component accepts a > > newsId parameter, that binding is bi-directional. When the event > > occurs in the component it calls the setter of the bound parameter, > > which updates the value in the page and gets put back into the url via > > context returned by onPassivate. When the value is set during render > > time the component grabs the news item and renders it, if not it grabs > > the top five and displays them... > > > > Perhaps as Joel pointed out we're just making this too complicated and > > we should be the ones kicked out! > > > > Josh > > > > On Wed, Apr 30, 2008 at 1:27 PM, Chris Lewis <[EMAIL PROTECTED]> wrote: > > > >> I see how this whole push on/pull off environment will solve the issue, > >> but it just seems so nasty. I mean really, how is that any simpler than > >> dealing directly with query parameters? I point at this only to > >> highlight that perhaps Janos has brought to light a legitimately rough > >> edge in T5, or else there's a cleaner way to do it and we're all just > >> missing it. I'm convinced that the event system is the way to go as it > >> seems a natural fit, but the redirect-after-action part is rendering it > >> useless without using @Persist! Let me share what I've put together, and > >> maybe someone will find the missing piece. I have a working test and > >> I'll abbreviate the code here and assume a few things: > >> > >> (coming in another message - i tripped the spam filter :-| ) > >> > >> > >> Josh Canfield wrote: > >> > >>> Are you trying to keep the news id out of the url? Doesn't sound like > >>> it from your response to not doing the redirect. Since that's the > >>> case, why not add it to the page context? > >>> > >>> I suppose if you were building a portal with several components then > >>> keeping track of component parameters could get unwieldy. If you were > >>> showing a news article from the news portlet, and a stock highlight > >>> from the stock portlet... At that point you're sort of building a > >>> framework on a framework. > >>> > >>> You could build your page such that it accumulated context from it's > >>> components. Push a ComponentContext object into the Environment > >>> onActivate, and setupRender in your page (env gets cleared before > >>> render phase, not sure if there is a better way than doing it in > >>> both.) Then collect component parameter mappings. onPassivate for your > >>> page would organize and return these as it's context (you might want > >>> to sort them to get consistent results) > >>> > >>> Your url might look like this: > >>> > >>> http://localhost/context/mypage/cc/news/4527/stock/MCD > >>> > >>> Then onactivate you init the ComponentContext from the url keying off > >>> the "cc" to grab the remaining parameters and use them as key/value > >>> for the components. The your components do something like: > >>> > >>> @Environmental > >>> private ComponentContext _compContext; > >>> > >>> void setupRender() { > >>> Long newsId = _compContext.getLong(_resources.getId()); > >>> } > >>> > >>> void onPickNewsItem(Long id) { > >>> _compContext.put(_resources.getId(), id); > >>> } > >>> > >>> > >>> Josh > >>> > >>> On Wed, Apr 30, 2008 at 5:23 AM, János Jarecsni > >>> <[EMAIL PROTECTED]> wrote: > >>> > >>> > >>>> Hi Chris, > >>>> > >>>> I try to explain :) > >>>> Say, you have a "NewsQuote" component, which shows a few lines from the 5 > >>>> latest news. At the and of each quotations, there a "More" link. Now, > >>>> when > >>>> the user clicks on this link (an action link, for that matter), the > >>>> NewsQuote component will set a request scope info saying that the news > >>>> with > >>>> ID=4527 is requested. And when it comes to the "News" component (it is > >>>> able > >>>> to show the text of a given news in full), it simply looks at this piece > >>>> of > >>>> info, and loads the news with id 4527 (or gets it from an app level cache > >>>> :)) and renders it. > >>>> > >>>> Hope it tells something about what I am up to :) > >>>> > >>>> thx > >>>> Janos > >>>> > >>>> 2008/4/30 Chris Lewis <[EMAIL PROTECTED]>: > >>>> > >>>> > >>>> > >>>> > >>>>> Honestly it's difficult for me to imagine a situation where I'd do that > >>>>> because it seems to violate a degree of encapsulation that tapestry > >>>>> imposes as a "freeing law" of the framework. The epicenter of that being > >>>>> that one should not think in terms of low-level idioms such as request > >>>>> parameters, and instead replace those with a higher level of application > >>>>> logic that eclipses them entirely (when possible). That's not to say > >>>>> that your perspective is flawed, but from the small bit of understanding > >>>>> I've taken from your posts I can't see why one would do what you want. > >>>>> The thing that I've been saying is missing here is, what are you trying > >>>>> to do? I don't mean technically, I mean what is the end result for the > >>>>> user? Understanding this is critical, but even if I don't your problem > >>>>> can still be solved by using a session to serve as an arbitrary holder. > >>>>> If you've settled on this architecture, why not write such a generic > >>>>> service and move on? > >>>>> > >>>>> > >>>>> > > -- > http://thegodcode.net > > -- -- TheDailyTube.com. Sign up and get the best new videos on the internet delivered fresh to your inbox. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]