29 February ColdFusion bug

Written on 9 March 2012, 10:57pm

Tagged with: , ,

This is just to log a funny bug I encountered a few days ago, on the 29th of February 2012. There was a piece of code that was comparing if a certain date is older than a year or not.
The algorithm to compare the date was creating the ‘one-year-ago date’ by substracting one unit from the current year. Something like:

<cfset aYearAgo = CreateDate(year-1,month,day)>

Obviously, this algorithm was failing on the 29th of February on the leap years (like 2012).
The solution is quite simple: instead of substracting one unit from the year, substract 365 days from the current date, using Coldfusion’s dateAdd function:

<cfset aYearAgo = DateAdd('d', -365, Now())> 
Image: Smashing Magazine’s Desktop Wallpaper Calendar February 2012

Coldfusion dot-notation: using multiple dots

Written on 23 February 2012, 10:25am

Tagged with: ,

A refresher about the ColdFusion structures:

ColdFusion structures consist of key-value pairs. Structures let you build a collection of related variables that are grouped under a single name.

Structure notation
ColdFusion supports three types of notation for referencing structure contents. The notation that you use depends on your requirements.

1. Object.property
You can refer to a property, prop, of an object, obj, as obj.prop. This notation, also called dot notation, is useful for simple assignments, as in this example:
depts.John="Sales"
2. Associative arrays
3. Structure
Adobe Livedocs

What is interesting about the dot-notation, is that using multiple dots in referencing the object property – is allowed.
The following code executes correctly in ColdFusion 8 and outputs ‘Foo’:

<cfset myStruct = StructNew()>
<cfset myStruct.a = '1'>
<cfset myStruct.b = '2'>
<cfset myStruct.c = '3'>

<CFIF #myStruct..a# EQ 1 
	AND #myStruct.....b# EQ 2
	AND #myStruct..........c# EQ 3
>
	Foo
</CFIF>

Cfargument: required and default attributes

Written on 11 January 2012, 03:30pm

Tagged with:

Just noting an interesting observation about the attributes of the cfargument tag.
What happens if you set the required="true" attribute, but also the default attribute?
The answer is in the documentation: if passed, the ‘default‘ attribute is used, and the ‘required‘ attribute is ignored.

required (optional, default=’no’):
Specifies whether the parameter is required to execute the component method. The parameter is not required if you specify a default attribute.
-link

An example below:

dummy.cfc:

<cfcomponent>
	<cffunction name="add">
		<cfargument name="a" required="true" type="string" default="1" />
		<cfargument name="b" required="true" type="string" default="1" />
		<cfreturn a+b>
	</cffunction>
</cfcomponent>

dummy.cfm:

<cfinvoke component="dummy"
	method="add"
	returnVariable="sum" />
<cfoutput>#sum#</cfoutput>

The example below will still output 2, even if we call the ‘add’ method without any argument. The default values are used.