Load, Validate, and Submit Forms using Ext JS 3.0: Part 3

4 min read

Loading form data from the server

An important part of working with forms is loading the data that a form will display. Here’s how to create a sample contact form and populate it with data sent from the server.

How to do it…

  1. Declare the name and company panel:
      var nameAndCompany = { columnWidth: .5,
      layout: 'form',
      items: [
      { xtype: 'textfield',
      fieldLabel: 'First Name',
      name: 'firstName',
      anchor: '95%'
      },
      {
      xtype: 'textfield',
      fieldLabel: 'Last Name',
      name: 'lastName',
      anchor: '95%'
      },
      {
      xtype: 'textfield',
      fieldLabel: 'Company',
      name: 'company',
      anchor: '95%'
      },
      {
      xtype: 'textfield',
      fieldLabel: 'Title',
      name: 'title',
      anchor: '95%'
      }
      ]
      }

  2. Declare the picture box panel:
      var picBox = {
      columnWidth: .5,
      bodyStyle: 'padding:0px 0px 0px 40px',
      items: [
      { xtype: 'box',
      autoEl: { tag: 'div',
      style: 'padding-bottom:20px',
      html: '<img id="pic" src="' + Ext.BLANK_IMAGE_URL + '"
      class="img-contact" />'
      }
      },
      { xtype: 'button',
      text: 'Change Picture' }
      ]
      }
  3. Define the Internet panel:
      var internet = { columnWidth: .5,
      layout: 'form',
      items: [
      { xtype: 'fieldset',
      title: 'Internet',
      autoHeight: true,
      defaultType: 'textfield',
      items: [{
      fieldLabel: 'Email',
      name: 'email',
      vtype: 'email',
      anchor: '95%'
      },
      { fieldLabel: 'Web page',
      name: 'webPage',
      vtype: 'url',
      anchor: '95%'
      },
      { fieldLabel: 'IM',
      name: 'imAddress',
      anchor: '95%'
      }]
      }]
      }
  4. Declare the phone panel:
      var phones = { columnWidth: .5,
      layout: 'form',
      items: [{ xtype: 'fieldset',
      title: 'Phone Numbers',
      autoHeight: true,
      defaultType: 'textfield',
      items: [{
      fieldLabel: 'Home',
      name: 'homePhone',
      anchor: '95%'
      },
      {
      fieldLabel: 'Business',
      name: 'busPhone',
      anchor: '95%'
      },
      {
      fieldLabel: 'Mobile',
      name: 'mobPhone',
      anchor: '95%'
      },
      {
      fieldLabel: 'Fax',
      name: 'fax',
      anchor: '95%'
      }]
      }]
      }

  5. Define the business address panel:
      var busAddress = { columnWidth: .5,
      layout: 'form',
      labelAlign: 'top',
      defaultType: 'textarea',
      items: [{
      fieldLabel: 'Business',
      labelSeparator:'',
      name: 'bAddress',
      anchor: '95%'
      },
      {
      xtype: 'radio',
      boxLabel: 'Mailing Address',
      hideLabel: true,
      name: 'mailingAddress',
      value:'bAddress',
      id:'mailToBAddress'
      }]
      }

  6. Define the home address panel:
      var homeAddress = { columnWidth: .5,
      layout: 'form',
      labelAlign: 'top',
      defaultType: 'textarea',
      items: [{
      fieldLabel: 'Home',
      labelSeparator:'',
      name: 'hAddress',
      anchor: '95%'
      },
      {
      xtype: 'radio',
      boxLabel: 'Mailing Address',
      hideLabel: true,
      name: 'mailingAddress',
      value:'hAddress',
      id:'mailToHAddress'
      }]
      }
  7. Create the contact form:
      var contactForm = new Ext.FormPanel({
      frame: true,
      title: 'TODO: Load title dynamically',
      bodyStyle: 'padding:5px',
      width: 650,
      items: [{
      bodyStyle: {
      margin: '0px 0px 15px 0px'
      },
      items: [{
      layout: 'column',
      items: [nameAndCompany, picBox]
      }]
      },
      {
      items: [{
      layout: 'column',
      items: [phones, internet]
      }]
      },
      {
      xtype: 'fieldset',
      title: 'Addresses',
      autoHeight: true,
      hideBorders: true,
      layout: 'column',
      items: [busAddress, homeAddress]
      }],
      buttons: [{
      text: 'Save'
      },
      {
      text: 'Cancel'
      }]
      });
  8. Handle the form’s actioncomplete event:
      contactForm.on({
      actioncomplete: function(form, action){
      if(action.type == 'load'){
      var contact = action.result.data;
      Ext.getCmp(contact.mailingAddress).setValue(true);
      contactForm.setTitle(contact.firstName + ' ' +
      contact.lastName);
      Ext.getDom('pic').src = contact.pic;
      }
      }
      });

  9. Render the form:
      contactForm.render(document.body);
  10. Finally, load the form:
      contactForm.getForm().load({ url: 'contact.php',
      params:{id:'contact1'},
      waitMsg: 'Loading'
      });


How it works…

The contact form’s building sequence consists of defining each of the contained panels, and then defining a form panel that will serve as a host. The following screenshot shows the resulting form, with the placement of each of the panels pinpointed:

Moving on to how the form is populated, the JSON-encoded response to a request to provide form data has a structure similar to this:

{success:true,
data:{id:’1′,firstName:’Jorge’,lastName:’Ramon’,
company:’MiamiCoder’,title:’Mr’,pic:’img/jorger.jpg’,
email:’ramonj@miamicoder.net’,webPage:’http://www.miamicoder.com’,
imAddress:”,homePhone:”,busPhone:’555 555-5555′,
mobPhone:”,fax:”,
bAddress:’123 Acme Rd #001nMiami, FL 33133′,
hAddress:”,mailingAddress:’mailToBAddress’}}

The success property indicates whether the request has succeeded or not. If the request succeeds, success is accompanied by a data property, which contains the contact’s information. Although some fields are automatically populated after a call to load(), the form’s title, the contact’s picture, and the mailing address radio button require further processing. This can be done in the handler for the actioncomplete event:

contactForm.on({
actioncomplete: function(form, action){
if(action.type == ‘load’){}
}
});

As already mentioned, the contact’s information arrives in the data property of the action’s result:

var contact = action.result.data;

The default mailing address comes in the contact’s mailingAddress property. Hence, the radio button for the default mailing address is set as shown in the following line of code:

Ext.getCmp(contact.mailingAddress).setValue(true);

The source for the contact’s photo is the value of contact.pic:

Ext.getDom(‘pic’).src = contact.pic;

And finally, the title of the form:

contactForm.setTitle(contact.firstName + ‘ ‘ + contact.lastName);

There’s more…

Although this recipe’s focus is on loading form data, you should also pay attention to the layout techniques used—multiple rows, multiple columns, fieldsets—that allow you to achieve rich and flexible user interfaces for your forms.

See Also…

  • The next recipe, Serving the XML data to a form, explains how to use a form to load the XML data sent from the server.
Packt

Share
Published by
Packt

Recent Posts

Top life hacks for prepping for your IT certification exam

I remember deciding to pursue my first IT certification, the CompTIA A+. I had signed…

3 years ago

Learn Transformers for Natural Language Processing with Denis Rothman

Key takeaways The transformer architecture has proved to be revolutionary in outperforming the classical RNN…

3 years ago

Learning Essential Linux Commands for Navigating the Shell Effectively

Once we learn how to deploy an Ubuntu server, how to manage users, and how…

3 years ago

Clean Coding in Python with Mariano Anaya

Key-takeaways:   Clean code isn’t just a nice thing to have or a luxury in software projects; it's a necessity. If we…

3 years ago

Exploring Forms in Angular – types, benefits and differences   

While developing a web application, or setting dynamic pages and meta tags we need to deal with…

3 years ago

Gain Practical Expertise with the Latest Edition of Software Architecture with C# 9 and .NET 5

Software architecture is one of the most discussed topics in the software industry today, and…

3 years ago