Okay let's pre-populate this field:
add(new TextField("url", new PropertyModel(cnavUrl, "URL"))
.setRequired(true)
.add(new UrlValidator()));
Its mode is a new PropertyModel(cnavUrl, "URL"), which is the "CnavUrl
cnavUrl = new MorphiaCnavUrl();".
So it's the cnavUrl.getUrl() value.
What do you get when you call new MorphiaCnavUrl().getUrl()?
That's what should appear in the TextField when you first load the page
(normally read form the DB).
~ Thank you,
Paul Bors
-----Original Message-----
From: Daniel Watrous [mailto:[email protected]]
Sent: Thursday, July 18, 2013 6:03 PM
To: [email protected]
Subject: Re: Form questions
I've made a lot of progress and been through chapters 9 and 10 of Wicket
Free Guide, but I'm still stumped on point #2, pre-populating the form.
Here's what I have right now:
public class CnavForm extends Form {
@Inject private CnavUrlDAO cnavUrlDAO;
public CnavForm(String id) {
super(id);
CnavUrl cnavUrl = new MorphiaCnavUrl();
setModel(new Model((Serializable) cnavUrl));
add(new TextField("url", new PropertyModel(cnavUrl, "URL"))
.setRequired(true)
.add(new UrlValidator()));
add(new HiddenField("objectid", new PropertyModel(cnavUrl, "id")));
add(new Button("publish") {
@Override
public void onSubmit() {
CnavUrl cnavUrl = (CnavUrl) CnavForm.this.getModelObject();
// check for existing record to know if this is a create or
update
if (((MorphiaCnavUrlModel)cnavUrl).getId() == null) {
// create
cnavUrlDAO.save(cnavUrl);
} else {
// update
cnavUrlDAO.save(cnavUrl);
}
}
});
}
}
I need to know how to do two things.
1) how to link to the page that displays the form, and pass it the ID for
the record I want to edit
2) load the object from the database and have it replace the model I create
in the constructor
Obviously I can make a database call and get the object. Is the constructor
called every time the page is requested, so that I could check for an ID and
either create the model or load it from the database? If so, then I just
need help with #1.
Thanks,
Daniel
On Wed, Jul 17, 2013 at 10:19 AM, Daniel Watrous
<[email protected]>wrote:
> I think I'm getting it now. The Form needs to be embedded in a panel
> for the type of inclusion that I'm interested in.
>
> I created a CnavFormPanel.java and changed CnavForm.html to
> CnavFormPanel.html. I left CnavForm.java alone.
>
> In CnavModify.java I removed this
>
> Form form = new CnavForm("cnavFormArea");
> add(form);
>
> And added this
>
> add(new CnavFormPanel("cnavFormArea"));
>
> That works. Thanks for your help.
>
> Daniel
>
>
> On Wed, Jul 17, 2013 at 10:07 AM, Daniel Watrous
<[email protected]>wrote:
>
>> I can make it work if I put the markup from CnavForm.html directly
>> into CnavModify, but the form is not as reusable then. I would have
>> to duplicate the markup for other pages that use the same form...
>>
>> Dnaiel
>>
>>
>> On Wed, Jul 17, 2013 at 9:55 AM, Daniel Watrous
<[email protected]>wrote:
>>
>>> That's what I tried to do. I created CnavForm.java and
>>> CnavForm.html. In the latter file I have this
>>> <wicket:panel>
>>> <form wicket:id="cnavForm"...>
>>> // form details
>>> </form>
>>> </wicket:panel>
>>>
>>> Then I have CnavModify.java and CnavModify.html. You already see
>>> what I have in CnavModify.java from my last email. My CnavModify.html
has this.
>>> <wicket:extend>
>>> <span wicket:id="cnavFormArea">Here's the form</span>
>>> </wicket:extend>
>>>
>>> Rather than render I'm getting this error:
>>> Last cause: Component [cnavFormArea] (path = [0:cnavFormArea]) must
>>> be applied to a tag of type [form], not: '<span wicket:id="cnavFormArea"
>>> id="cnavFormArea3">' (line 0, column 0)
>>>
>>> I'll keep trying and report back when I figure it out.
>>>
>>> Daniel
>>>
>>>
>>> On Tue, Jul 16, 2013 at 10:50 PM, Paul Bors <[email protected]> wrote:
>>>
>>>> Wicket is a MVC component driven framework similar to Swing.
>>>> In short, what you want to do is create your own Panel with that
>>>> form file of yours and add it to another Panel as a child.
>>>>
>>>> See chapter 4 "Keeping control over HTML" of the Wicket Free Guide at:
>>>> http://code.google.com/p/wicket-guide/
>>>>
>>>> Also available from under the Learn section as the Books link on
>>>> the right side navigation section on Wicket's home page at:
>>>> http://wicket.apache.org/learn/books/
>>>>
>>>> ~ Thank you,
>>>> Paul Bors
>>>>
>>>> -----Original Message-----
>>>> From: Daniel Watrous [mailto:[email protected]]
>>>> Sent: Tuesday, July 16, 2013 7:13 PM
>>>> To: [email protected]
>>>> Subject: Re: Form questions
>>>>
>>>> Thanks Paul and Sven. I got the form to work and available in the
>>>> onSubmit handler.
>>>>
>>>> Now I'm interested in splitting the form out into it's one file. So
>>>> I created a class that has nothing more than the form, but I'm not
>>>> sure how to include this into a page.
>>>>
>>>> In my class I do this:
>>>>
>>>> public class CnavModify extends ConsoleBasePage {
>>>>
>>>> public CnavModify(PageParameters parameters) {
>>>> super(parameters);
>>>>
>>>> Form form = new CnavForm("cnavFormArea");
>>>> add(form);
>>>> }
>>>> }
>>>>
>>>> My CnavModify obviously extends a base page. What do I put inside
>>>> the <wicket:extend> tag to have the form render?
>>>>
>>>> Daniel
>>>>
>>>>
>>>> On Tue, Jul 16, 2013 at 12:00 AM, Sven Meier <[email protected]> wrote:
>>>>
>>>> > Hi,
>>>> >
>>>> >
>>>> > Some problems I can't figure out. The code to create the button
>>>> > complains
>>>> >> that it requires a CnavUrl but gets back a String.
>>>> >>
>>>> >> add(new Button("publish", model) {
>>>> >> @Override
>>>> >> public void onSubmit() {
>>>> >> CnavUrl cnavUrl = (CnavUrl) getModelObject();
>>>> >> System.out.println("publish");
>>>> >> }
>>>> >> });
>>>> >>
>>>> >
>>>> > a Button always has a IModel<String> to fill the value attribute.
>>>> > Note that in #onSubmit() you're getting the model object of the
>>>> > button, not of your form.
>>>> > You can write:
>>>> >
>>>> > add(new Button("publish", model) {
>>>> >> @Override
>>>> >> public void onSubmit() {
>>>> >> CnavUrl cnavUrl = (CnavUrl)
>>>> MyForm.this.getModelObject();
>>>> >> System.out.println("publish");
>>>> >> }
>>>> >> });
>>>> >>
>>>> >
>>>> > Using generic types in your code should help you.
>>>> >
>>>> > Sven
>>>> >
>>>> >
>>>> >
>>>> > On 07/15/2013 11:41 PM, Daniel Watrous wrote:
>>>> >
>>>> >> Hello,
>>>> >>
>>>> >> I'm interested in creating a single Form that will accommodate
>>>> >> the following use cases
>>>> >> 1) display blank for creating new records
>>>> >> 2) pre-populate for editing existing records
>>>> >> 3) map submitted values on to an existing domain object
>>>> >> 4) accommodate two actions, Save Draft -or- Publish
>>>> >>
>>>> >> I'm following Wicket in Action and within my Form constructor I
>>>> >> create my model, like this
>>>> >>
>>>> >> CnavUrl cnavUrl = new BasicCnavUrl();
>>>> >> IModel model = new Model((Serializable) cnavUrl);
>>>> >> setModel(model);
>>>> >>
>>>> >> I then use PropertyModel
>>>> >>
>>>> >> add(new TextField("url", new PropertyModel(cnavUrl,
>>>> >> "url")));
>>>> >>
>>>> >> For the two actions, I'm creating the Button objects like this
>>>> >>
>>>> >> add(new Button("publish", model) {
>>>> >> @Override
>>>> >> public void onSubmit() {
>>>> >> CnavUrl cnavUrl = (CnavUrl) getModelObject();
>>>> >> System.out.println("publish");
>>>> >> }
>>>> >> });
>>>> >>
>>>> >> Some problems I can't figure out. The code to create the button
>>>> >> complains that it requires a CnavUrl but gets back a String.
>>>> >>
>>>> >> It seems that a new BasicCnavUrl is created once with the Form.
>>>> >> What happens on subsequent calls? Can I always expect my model
>>>> >> to have the data from the current form submission?
>>>> >>
>>>> >> Is there a best way to incorporate the idea of an edit, where
>>>> >> the model is pre-populated from a data source and pre-fills the
>>>> >> Form
>>>> fields?
>>>> >>
>>>> >> Thanks,
>>>> >> Daniel
>>>> >>
>>>> >>
>>>> >
>>>> > ------------------------------**------------------------------**-
>>>> > -----
>>>> > --- To unsubscribe, e-mail:
>>>> > users-unsubscribe@wicket.**apache.org
>>>> <[email protected].
>>>> > org> For additional commands, e-mail:
>>>> > org> [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]