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.

Reply via email to