Twitter: raymondcamden


Address: Lafayette, LA, USA

Custom columns in Spry

12-27-2006 4,394 views

A few days ago I posted a link to a few new Spry demos including one that shows how to build custom columns in Spry. This is a pretty cool feature so I thought I'd whip up another demo so folks can really appreciate how handy this is. The idea is simple: You tell Spry to run code after the data is loaded and simply manipulate the data structure to add the new column. The new column can contain anything you want. This is great if you don't have control over the XML that your Spry page is using.

Consider an XML document that returns a ColdFusion date:

view plain print about
1<cfsetting enablecfoutputonly="true" showdebugoutput="false">
2
3<cfcontent type="text/xml">
4<cfoutput><people>
5    <person>
6        <name>Raymond Camden</name>
7        <date>#now()#</date>
8    </person>
9    <person>
10        <name>Jacob Camden</name>
11        <date>#now()#</date>
12    </person>
13</people></cfoutput>

This simple XML file will return two people. The date value for each will be set to the current time. If used as is, the date would look like this:

{ts '2006-12-27 09:20:35'}

Pretty ugly, eh? So lets make it nicer. First lets add an "Observer" to the Spry dataset. This tells Spry to run a function on any type of change in the data set:

view plain print about
1data.addObserver(processData);

Now lets look at the processData function:

view plain print about
1function processData(notificationType, notifier, thisdata) {
2    if (notificationType != "onPostLoad") return;
3
4    var rows = data.getData();
5    var numRows = rows.length;
6
7    for (var i = 0; i < numRows; i++) {
8        var row = rows[i];
9        row.datepretty = myDateFormat(cfToDate(row.date));
10    }    
11}

First note that we check the event type with the notificationType variable. (I based my function on the Adobe sample, so thanks go to them.) We get the data and the number of rows and then simply loop over the rows of data.

To add my custom column, I simply set a new value in the row. If I did:

view plain print about
1row.goober = "foo";

Then the dataset would have a new column named goober with a static value of foo.

In my sample code, I wrote two custom functions, cfToDate, and myDateFormat. These are ugly functions that parse the date sent from ColdFusion and handle the formatting of the date. This could probably be done better, but you get the idea. I've included them in the zip (see Download link below).

Anyway - this is a very handy feature! Obviously you want to correct the XML server side if at all possible, but if you can't, this is a great way to handle it.

Download attached file