actualy, you need not even do anything on the server side for such tabs, this can be easily achieved with a small javascript function. go through all children and generate tab controls taking title attribute as ctrl text:
child.getAttribute("title"); for example I have a small hacked up js just for it it uses label instead title var TapestryUtil = { createTabs: function(id){ var elem = $(id); var selected = elem.getAttribute("selected"); var tabs = document.createElement("DIV"); tabs.className = "minitab"; var cont = document.createElement("DIV"); cont.className = "minitab_content"; var ch; while(ch = elem.firstChild){ elem.removeChild(ch); cont.appendChild(ch); var code = ch.getAttribute("code"); var label = ch.getAttribute("label"); var tab = document.createElement("A"); tab.href="#"+(code||""); tab.className = "minitab"; tab.innerHTML = label || code || "unlabelled"; tab._refContent = ch; tab.onclick = tabClick; if(code != null && selected != "null" && selected == code){ ch.style.display == ""; }else if(selected != null) ch.style.display == "none"; if(ch.style.display != "none") tab.className += " selected_minitab"; tabs.appendChild(tab); } elem.appendChild(tabs); elem.appendChild(cont); function tabClick(){ var current = this; this.blur(); var ch = current.parentNode.firstChild; while(ch){ if(ch != current){ Element.removeClassName(ch,"selected_minitab"); ch._refContent.style.display = "none"; }else{ Element.addClassName(ch,"selected_minitab"); ch._refContent.style.display = ""; } ch = ch.nextSibling; } return false; } } }; Davor Hrg On Tue, Mar 11, 2008 at 1:15 PM, David Marquis <[EMAIL PROTECTED]> wrote: > Hi, > > He's having the same problem I had some time ago. > Suppose I want to create a Tab Component and I want to be able to > define it like this in the templates: > > <t:tabs t:id="myTabs"> > <t:tab t:id="tabOne" title="First tab"> > <h1>Body of tab1</h1> > <p>Continuing body...</p> > </t:tab> > <t:tab t:id="tabTwo" title="Second tab"> > <h1>Body of tab2</h1> > <p>Continuing body...</p> > </t:tab> > </t:tabs> > > If would then like to 'render' this about that way: > > <div class="tabs"> > <ul class="tabTitles"> > <li><a href="." onclick="switchtabs(1);">First tab</li> > <li><a href="." onclick="switchtabs(2);">Second tab</li> > </ul> > <div id="tabOne" class="tab selected"> > <h1>Body of tab1</h1> > <p>Continuing body...</p> > </div> > <div id="tabTwo" class="tab"> > <h1>Body of tab2</h1> > <p>Continuing body...</p> > </div> > </div> > > This is, I think, the most natural way of expressing tabs. > But such a thing is not possible, because the Tabs component cannot > accessing its child Tag components dynamically. > More: if you provide a body for a component (like above), you cannot > provide a template for this same component. > > I haven't found a way to implement such a component, and I think I had > about the same initial problem as Christopher : A component cannot > easily access its 'children' defined in the base template, build an > internal model from that, and render using this model and an internal > template. > > -- > David > > > > On 11-Mar-08, at 6:57 AM, Davor Hrg wrote: > > > explain what are zou trzing to achieve, maybe we can offer a different > > approach.. > > > > Davor Hrg > > > > On Tue, Mar 11, 2008 at 10:33 AM, Cordenier Christophe > > <[EMAIL PROTECTED]> wrote: > >> Thank you for your answer, > >> > >> But actually my component must access its child in a dynamic way. > >> It will be used in different context for analysis purpose. > >> > >> I've been searching for different ways to access a component body. > >> > >> For exemple, by using "nestedId" at creation time by decorating the > >> PageElementFactory to identify if a component is contained in my > >> component, but the nestedId does not contain the id of the parent > >> component but is only suffixed to the container nested id. > >> > >> By decorating ComponentPageElement and intercepting "addToBody" > >> method call for my component only, but it was not enough for the > >> children and I don't want to generalize the use of these kind of > >> hooks or wrapping mechanism because of the "internal" aspect of the > >> PageElementFactory and ComponentPageElement classes. > >> > >> Best regards, > >> Christophe. > >> > >> -----Message d'origine----- > >> De : Davor Hrg [mailto:[EMAIL PROTECTED] > >> Envoyé : mardi 11 mars 2008 10:08 > >> À : Tapestry users > >> Objet : Re: T5 : How to access to a Component Body ? > >> > >> > >> > >> you can not access child components geenricaly, > >> but you can access blocks by id. > >> > >> you can embed components > >> @Component TextField name; //component's class is decided here > >> and in template simply put: > >> <div t:id="name"/> > >> > >> > >> but to access a textfield as Field you can: > >> @InjectComponent private Field name; > >> and then component's class is resolved from the template > >> so in the template you must put: > >> <t:textfield id="name"/> > >> > >> > >> you can not use it like this: > >> @Component private Field name; > >> and in template > >> <t:textfield id="name"/> > >> > >> > >> Davor Hrg > >> On Tue, Mar 11, 2008 at 9:25 AM, Cordenier Christophe > >> <[EMAIL PROTECTED]> wrote: > >>> Hello, > >>> > >>> I'm currently working on a component that needs to access the > >>> content of its body to extract informations like parameters, or > >>> persistent variable used by the components declared in its body. > >>> > >>> Actually, the ComponentResources class allows me to access the > >>> container of a component, but it appears that a child is not > >>> "contained in" the component. > >>> This should have helped me from a down-top view. > >>> > >>> And I didn't find any method to access the body of a component. > >>> > >>> Does anyone knows a way to access the children of a component ? > >>> > >>> Best Regards, > >>> Christophe Cordenier. > >>> > >>> > >>> Ce message et les pi?ces jointes sont confidentiels et r?serv?s ? > >>> l'usage exclusif de ses destinataires. Il peut ?galement ?tre prot? > >>> g? par le secret professionnel. Si vous recevez ce message par > >>> erreur, merci d'en avertir imm?diatement l'exp?diteur et de le d? > >>> truire. L'int?grit? du message ne pouvant ?tre assur?e sur > >>> Internet, la responsabilit? du groupe Atos Origin ne pourra ?tre > >>> recherch?e quant au contenu de ce message. Bien que les meilleurs > >>> efforts soient faits pour maintenir cette transmission exempte de > >>> tout virus, l'exp?diteur ne donne aucune garantie ? cet ?gard et > >>> sa responsabilit? ne saurait ?tre recherch?e pour tout dommage r? > >>> sultant d'un virus transmis. > >>> > >>> This e-mail and the documents attached are confidential and > >>> intended solely for the addressee; it may also be privileged. If > >>> you receive this e-mail in error, please notify the sender > >>> immediately and destroy it. As its integrity cannot be secured on > >>> the Internet, the Atos Origin group liability cannot be triggered > >>> for the message content. Although the sender endeavours to > >>> maintain a computer virus-free network, the sender does not > >>> warrant that this transmission is virus-free and will not be > >>> liable for any damages resulting from any virus transmitted. > >>> > >>> > >>> --------------------------------------------------------------------- > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > >>> For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >>> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > >> > >> > >> Ce message et les pièces jointes sont confidentiels et réservés à > >> l'usage exclusif de ses destinataires. Il peut également être > >> protégé par le secret professionnel. Si vous recevez ce message par > >> erreur, merci d'en avertir immédiatement l'expéditeur et de le > >> détruire. L'intégrité du message ne pouvant être assurée sur > >> Internet, la responsabilité du groupe Atos Origin ne pourra être > >> recherchée quant au contenu de ce message. Bien que les meilleurs > >> efforts soient faits pour maintenir cette transmission exempte de > >> tout virus, l'expéditeur ne donne aucune garantie à cet égard et sa > >> responsabilité ne saurait être recherchée pour tout dommage > >> résultant d'un virus transmis. > >> > >> > >> > >> This e-mail and the documents attached are confidential and > >> intended solely for the addressee; it may also be privileged. If > >> you receive this e-mail in error, please notify the sender > >> immediately and destroy it. As its integrity cannot be secured on > >> the Internet, the Atos Origin group liability cannot be triggered > >> for the message content. Although the sender endeavours to maintain > >> a computer virus-free network, the sender does not warrant that > >> this transmission is virus-free and will not be liable for any > >> damages resulting from any virus transmitted. > >> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]