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]

Reply via email to