| By Nahuel Foronda, Laura Arguello | Article Rating: |
|
| March 14, 2006 05:00 PM EST | Reads: |
26,389 |
In Part 1 of this tutorial (CFDJ, Vol.7, issue 12), you built a search interface for the Real Estate sample application. In Part 2, you'll learn how to populate a form by binding the fields to a datagrid, and then edit, add, and remove records from the database. You will add functionality to the one-screen interface you started to build in Part 1 using ColdFusion and Flash Remoting.
Requirements
To complete this tutorial you will need to install the following software and files:
ColdFusion MX 7.01
For a trial download go to www.macromedia.com/cfusion/tdrc/index.cfm?
product=coldfusion&promoid=devcenter_tutorial_product_090903. To buy go to www.macromedia.com/software/coldfusion/buy/
?promoid=devcenter_tutorial_coldfusion_090903. To get the updater go to www.macromedia.com/support/coldfusion/downloads_updates.html#mx7.
- Database: Microsoft Access, SQL Server, or MySQL
- Tutorials and sample files: http://download.macromedia.com/pub/developer/realestate_pt2.zip. This tutorial builds on the files from Part 1 (http://coldfusion.sys-con.com/read/172578_f.htm or www.macromedia.com/devnet/coldfusion/articles/flashforms.html). You can use your files from there and add the functionality from this tutorial. If you prefer, you can download this file, which has the complete code for Part 2.
Prerequisite Knowledge
- Part 1 of this tutorial
- Basic knowledge of ColdFusion components and Flash Forms
- Ability to set up a data source and write simple SQL statements
In this tutorial, you'll populate the Add/Edit panel with the record details for the user's search so that the user can edit, remove, and add new records from the same panel (see Figure 1).
Code the following functionality:
- Populate the edit form by binding fields to the selected record in the datagrid.
- Create a ColdFusion component to add, update, and delete records from the database.
- Create a Flash Remoting service CFC.
- Call the service and get results.
The bottom-right panel contains a form with an input for every attribute of a property listing: address, price, number of bedrooms, bathrooms, amenities, and so forth. Most of the fields are text input fields, but there are also controls for selects, radio buttons, check boxes, a text area, and a date field.
When a user opens the application (you can try it by going to http://localhost:8500/realestate/index.cfm), he or she selects search criteria and the application returns the search results. The user clicks one of the records in the datagrid and expects the detail panel in the bottom-right corner to display the details of the selected record. Where will the necessary information come from?
In Part 1 of this tutorial, the search returned query results that contained all of the columns in the "listing" table in the database. However, only a few of those columns - namely Price, Type, Bedrooms, Bathrooms, and Footage - appeared in the datagrid.
"What a waste of bandwidth!" you may have thought. Not really so, because you will need the additional columns to populate the entire form.
Populate each field from a column of the query returned by the search. The query that populates the datagrid is "stored" in the datagrid. To get the data corresponding to the selected row in the grid, access the cfgrid by its name (listingGrid) and its special property (selectedItem); the name and property specify the row the user selected.
Then, with dot notation, select the specific column you need, which is different for each input. The complete path is this: listingGrid.selectedItem.columnName. Use this path for all of the columns of the query, even if they were not defined as datagrid columns with the cfgridcolumn tag.
Binding Each Field Type
Now that you know how to get the data for each property listing attribute, you are ready to display it. Just below the search results, add a new panel (note that Part 1's sample files already contain this panel) that contains the add/edit form:
<cfformgroup type="panel" label="Add / Edit Properties">
</cfformgroup>
Within this panel, you will add, one by one, all the fields corresponding to each property listing attribute, such as address, number of bedrooms, and so forth. Each field has a different length or type, so you will use different controls or variations of the same controls as user inputs. There are some differences in the way you populate each control.
Populating text input controls (<cfinput type="text">), textarea controls (<cftextarea>) and datefield controls (<cfinput type="datefield">) is straightforward if you simply use their bind property:
bind="{listingGrid.selectedItem.columnName}"
Checkbox values can be true or false. The column that populates the checkbox control must be a Boolean type so that you can write:
value="{listingGrid.selectedItem.columnName}"
Select and radio button controls are a different challenge. Neither of them have a bind or similar attribute that you can use to bind them directly. Instead, you must make the controls acquire the right choice when the selected record in the datagrid changes.
In ActionScript, controls fire events when certain things happen. For example, the datagrid fires an onChange event each time the user selects an item. You can make your cfgrid call a function or run a piece of ActionScript code every time that event fires. To tell the datagrid what to do in that event, use the onChange attribute:
<cfgrid name="listingGrid" onchange="listingGridChanged()">
You can call any function you want, either a built-in function such as alert('Datagrid selection changed!') or a custom function.
If you choose to call a custom function, such as listingGridChanged(), you must declare it in a <cfformitem type="script"> block:
<cfformitem type="script">
public function listingGridChanged():Void {
//select item in dropdowns
//select item in radio button group
}
</cfformitem>
To avoid repeating the same code for every select control, create a helper function to select a specific item in the select control. This function looks for the option value that matches the desired item and then selects it:
public function selectOption(select: mx.controls.ComboBox, optionToSelect:String):Void {
//go through every record to find the right one
for (var i:Number = 0; i< select.length; i++) {
if (select.getItemAt([i]).data == optionToSelect){
select.selectedIndex = i;
break;
}
}
}
Published March 14, 2006 Reads 26,389
Copyright © 2006 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Nahuel Foronda
Nahuel Foronda is one of the founders of Blue Instant (http://www.blueinstant.com), a web development firm specializing in Rich Internet Applications where he has been creating award-winning applications and offering training for the last five years. He also maintains a blog, called AS Fusion (http://www.asfusion.com), where he writes about Flash, ColdFusion and other web technologies.
More Stories By Laura Arguello
Laura Arguello is one of the founders of Blue Instant (http://www.blueinstant.com), a web development firm specializing in Rich Internet Applications where she has been creating award-winning applications and offering training for the last five years. She also maintains a blog, called AS Fusion (http://www.asfusion.com), where she writes about Flash, ColdFusion and other web technologies.
- Where Are RIA Technologies Headed in 2008?
- The Next Programming Models, RIAs and Composite Applications
- AJAX World RIA Conference & Expo Kicks Off in New York City
- Constructing an Application with Flash Forms from the Ground Up
- Building a Zip Code Proximity Search with ColdFusion
- Personal Branding Checklist
- CFEclipse: The Developer's IDE, Eclipse For ColdFusion
- Has the Technology Bounceback Begun?
- Adobe Flex 2: Advanced DataGrid
- i-Technology Viewpoint: We Need Not More Frameworks, But Better Programmers
- Web Services Using ColdFusion and Apache CXF
- Passing Parameters to Flex That Works
























