Assuming you're editing a bean, try this. In parent put something like this...
<t:form t:id="form" t:validate="myBean"> <t:if test="myBean"> <t:errors /> <div> <t:label for="firstname"/> <input t:id="firstname" value="myBean.firstName" t:type="textfield"/> </div> <t:myform.address mybean="myBean"/> <div> <input value="message:save-label" t:type="submit"/> <input t:id="cancel" value="message:cancel-label" t:type="submit" t:mode="cancel"/> </div> </t:if> <t:if test="!myBean"> My bean ${myBeanId} does not exist.<br/><br/> </t:if> </form> ...and in Address component, stuff like... <t:content> <div> <t:label for="streetname"/> <input t:id="streetname" value="aBean.streetName" t:type="textfield"/> </div> <div> <t:label for="countryname"/> <input t:id="countryname" value="countryName" t:type="textfield"/> </div> </t:content> If you're using JSR-303 Bean Validation, be sure the value uses exactly the same case for the bean's property name as the bean uses, eg. "streetName", not "streetname". Otherwise, the bean validator will miss it. If there's stuff you need to set up before rendering, then put it setupRender(). If there's stuff you need to set up before rendering AND on submit, then put it in a ComponentAction and, in setupRender(), ask FormSupport to storeAndExecute() it. See http://jumpstart.doublenegative.com.au/jumpstart/examples/component/subformasafield1 for a use case and code. If there's stuff you need to do on submit, then put it in a ComponentAction and, in afterRender(), ask FormSupport to store() it. : import org.apache.tapestry5.ValidationTracker; import org.apache.tapestry5.annotations.Component; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.components.TextField; import org.apache.tapestry5.services.FormSupport; : public class Address { // The context @Parameter(required = true, allowNull = false) @Property private MyBean aBean; // Screen fields @Property private String countryName; // Generally useful bits and pieces. @Component(id = "countryName") private TextField countryNameField; @Environmental private FormSupport formSupport; @Environmental private ValidationTracker tracker; private static final ProcessSubmission PROCESS_SUBMISSION = new ProcessSubmission(); // The code final void setupRender() { // In here, set up for render, eg. convert myBean.countryCode to a countryName... } void afterRender() { // If we are inside a form, ask FormSupport to store PROCESS_SUBMISSION in its list of actions to do on submit. // If I contain other components, their actions will already be in the list, before PROCESS_SUBMISSION. That is // because this method, afterRender(), is late in the sequence. This guarantees PROCESS_SUBMISSION will be // executed on submit AFTER the components I contain are processed (which includes their validation). if (formSupport != null) { formSupport.store(this, PROCESS_SUBMISSION); } } private static class ProcessSubmission implements ComponentAction<MyBean> { private static final long serialVersionUID = 1L; public void execute(MyBean component) { component.processSubmission(); } // This is optional... @Override public String toString() { return this.getClass().getSimpleName() + ".ProcessSubmission"; } }; private void processSubmission() { // Translate derived values. Eg. convert countryName to a countryCode... // Validate. if (countryCode == null) { tracker.recordError(countryNameField, getMessages().get("country-required")); return; } // Modify the bean with derived values. myBean.setCountryCode(countryCode); } } Cheers, Geoff On 01/11/2013, at 3:14 AM, Hottois Ludwig wrote: > Hi everyone ! > > I was asking myself during a long time how to correctly create a form for > create a user, but in this form, i want include a part wich is a form for > create an address. > > I was thinking first about putting this part of the form, which is created > for instruct informations about the user address, into a component, and > include this into the parent tml like : > > <t :form> > <t :texfield value= <name >/> > > <t :myform.address/> > .... > > </form> > > And into myform.address put : > > <t :container ...> > <t :textfield value= < roadName >/> > .... > </t :container> > > But if i do this, when i click on the submit on the principal form, the fired > event of validation asking is not catched by the < myform.address > component > i think ? > > And when i click on my submit, my principal form doesn't have any information > about my differents fields into the sub form. > > What are the best practices? > > Thanks, > Ludwig > > ________________________________ > > 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? de Worldline 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 Worldline 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.