I typed up a long response, but then reread your question and I think maybe I need some clarification. I included my original response below in case it answers your question. If you are looking for something that can be included in any page, rendered by any framework, then I'm not sure you really want to use Tapestry. The only way you are going to build something that can be used absolutely anywhere is to render the poll entirely in html and javascript. Take a look at dojo for examples of lots of widgets that can be used in any web page by simply including the correct js files. However, dojo does leave the backend processing as an exercise for the user, rather than providing a service to handle storing and rendering user input.
The difficult thing in your concept is submitting the results back to a server which will maintain totals and render them back to the browser, either graphically, or maybe just as a data structure that the browser can then use to render graphically. Tapestry can be used to do this, fairly easily, but in general, Tapestry is a fairly stateful framework that is used for building applications rather than just widgets that can be inserted into other apps. You could implement an IExternalPage which receives the selected answer and poll id in the URL, stores the answer against the poll id, and serves up totals. The only real caveat is that your tapestry-based pollserver is likely to be on a different host than the containing page, so you'll have to use cross domain techniques to allow tapestry to serve up js that can interact with the template provided in the containing page. This is basically just a matter of serving up js as a string and then eval()'ing that string within the context of the containing document. There are lots of discussions of cross-domain js on the web, so I'll leave that to you to research. You'd have the same problem with any framework you might choose to implement the backend in. Now, if you were just talking about building a tapestry poll component that can be used only in other Tapestry applications, the answer is definitely yes and I have a fairly detailed answer below: Yes, it is possible. There are a lot of parallels between your component and the contrib:Table component that comes with Tapestry (although the table is likely to be much more complex). Just to give you some concepts to refer to in your research, here's brief outline if what you'd likely do. Create a poll component that takes some data structure that defines the poll and the current results (assuming you also want to display results there). The poll component iterates over each poll answer rendering an @Block component that is provided by the page template. The @Block component contains all of the template code necessary to render a single answer of the poll. If the user wants a table, they open the table tag in their template, then include an @Block component which renders a single table row (or column, depending upon preference). You can use a different Block component to render a link to the results, a submit button, or anything else you care for. If you provide reasonable defaults, many users will never have to define a Block at all in order to use your poll. Your component is only responsible for providing default layout and data structures, but everything is overloadable via Blocks. Something like the following (I'll use a list this time, just to show the difference): <ul jwcid="[EMAIL PROTECTED]" questions="ognl:answers" index="ognl:currentanswer" element="literal:ul"> <span jwcid="[EMAIL PROTECTED]"> <li><span jwcid="@Insert" value="ognl:currentAnswer"/></li> </span> </ul> My little example above excludes the actual selection mechanism, submit button, or results display, but all of that is easy enough. You might find that your default 'Poll' component consists of multiple sub components - PollView, PollResults, PollSubmit. The little sample above is probably actually a PollView component which would be wrapped the Poll component. The PollView, PollResults, and PollSubmit can be placed in different locations, relative to each other, by simply replacing the outer Poll layer, or by using them without an outer Poll layer. This is exactly how the table component works, using a TableView to render the table, a TablePages component to render the page changing mechanism. The TableView itself consists of TableColumns, TableRows, etc. OK, assuming you are a tapestry novice, that probably went WAY over your head. However, it will hopefully give you some keywords to watch out for as you read documentation. I recommend that you read the first 4 chapters of the Enjoy Web Development with Tapestry ebook that is linked from the tapestry home page. You should also check out the tapestry tables tutorial webapp and then look at the source code to contrib:Table. You could probably read through all of that in a long day, if you don't actually implement any of the tutorial code, anyway. At the end of it, you should have a pretty good idea how to go about building your component, even though you'll still have a steep lerning curve to get through before you can actually get it working. --sam On 12/7/06, Deep Blue <[EMAIL PROTECTED]> wrote:
Hi, My project has the following requirements: 1. It is a poll component that can be inserted in any page, at any place that user like. 2. We don't have the control on how it should be display in the page, so, cannot have one global template page (e.g. jsp) to insert inside the page. But, we can specify some rules to tell the client how to put dynamic behaviour to the poll section in the page. The poll can appear as a table, or just plain text inside div. The appearance style of the poll should be done directly inside the page. 3. Pages is composed by client, and they can add pages (with poll inside) into the website from time to time. After they uploaded the page to server, the dynamic section (poll) is supposed to work without doing any configuration. It is sort of like plug and play concept. May I know if Tapestry is suitable for the above requirement? If not, anyone can suggest some better frameworks which can fullfill the requirement? Thanks!!! Best Regards, Deep Blue
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]