Using a ColdFusion Ternary Operator for an Optional Tag Attribute

Today I had to write a script to process a form and send an email as part of the processing. The form allows the user to specify an email address to bcc, but it’s not required. I’m a big fan of using the Ternary Operator for doing either/or stuff like css classes. So I decided to extend that fandom to set the bcc attribute of the <cfmail> tag if the email specified in the form was valid.

Assumptions for this example:

1. You have validated form.bccEmail as a valid email.
2. You have a default mail server specified in Application.cfc or CFADMIN.
3. You may see more utility in using the Ternary Operator for other conditional cases.

The “magic” is in the bcc attribute below:

    <cfmail to="someone@example.com" 
        bcc="#Len(form.bccEmail)?form.bccEmail:''#" 
        replyto="donotreply@example.com" 
        failto="donotreply@example.com" 
        from="donotreply@example.com" 
        subject="An important message" 
        type="html">
	    Message Body here...
    </cfmail>

ColdFusion function returns space before value

I had an annoying issue this morning where a function I wrote that rounds and formats values for use in an internal financial app kept sticking a single space before the value returned. This was obviously not good for a financial app. After spending 10-15 minutes tearing the function’s innards apart it turns out what was going on in the function was not the cause. The cause was simple.

In a tag based ColdFusion function you need to be sure to include the ‘output=”no”‘ attribute.

<cffunction name="RoundMoney" returntype="numeric" output="no"> 
     ... MAGIC STUFF HERE ...
</cffunction>

Helpful Commands for ColdFusion 10 on OSX… aka Start and Stop CF10 from the command line

This post assumes you are working with the default instance (cfsusion) and that you installed ColdFusion 10 to the default location on you Mac.

STATUS:
/Applications/ColdFusion10/cfusion/bin/coldfusion status

START:
/Applications/ColdFusion10/cfusion/bin/cf-standalone-startup
OR
/Applications/ColdFusion10/cfusion/bin/coldfusion start

STOP:
/Applications/ColdFusion10/cfusion/bin/coldfusion stop

RESTART:
/Applications/ColdFusion10/cfusion/bin/coldfusion restart

Launch GUI for configuring Web Connectors:
sudo /Applications/ColdFusion10/cfusion/runtime/bin/wsconfig

RESET CFADMIN PASSWORD:
/Applications/ColdFusion10/cfusion/bin/passwordreset.sh
(Then Enter 1 for changing Admin Password and put in your new super strong password!)

.

RDS Query Viewer not working: How to fix the ColdFusion Builder error: ‘/YOURPROJECTFOLDER/.rdsTempFiles/RDS Query Viewer’ does not exist

I have had this issue for a while and it finally made me crazy enough to try to figure it out. It appears that this error occurs when the “RDS Query Viewer” file does not exist in the .rdsTempFiles folder within your project.

On Mac

  1. Open Terminal
  2. Navigate to the directory where your project is located. For example type: cd /Applications/ColdFusion9/wwwroot/YOURPROJECTFOLDER and hit <enter>
  3. If the “.rdsTempFiles” directory does not exist type: mkdir .rdsTempFiles and hit <enter>
  4. If the “RDS Query Viewer” file does not exist type: touch “.rdsTempFiles/RDS Query Viewer” and hit <enter>. BE SURE TO SURROUND THE COMMAND WITH THE DOUBLE QUOTES BECAUSE THE FILE NAME HAS SPACES.
  5. Refresh the “RDS Query Viewer” view. RDS Query View should work now.

On Windows

  1. Open DOS
  2. Navigate to the directory where your project is located. For example type: cd C:\ColdFusion9\wwwroot\YOURPROJECTFOLDER and hit <enter>
  3. If the “.rdsTempFiles” directory does not exist type: mkdir .rdsTempFiles and hit <enter>
  4. If the “RDS Query Viewer” file does not exist type: fsutil file createnew “RDS Query Viewer” 0 and hit <enter>. BE SURE TO SURROUND THE COMMAND WITH THE DOUBLE QUOTES BECAUSE THE FILE NAME HAS SPACES.
  5. Refresh the “RDS Query Viewer” view. RDS Query View should work now.

ColdFusion 9 SELECT IN query using ormExecuteQuery()

For some reason this took me some effort to figure out. Maybe others will find it useful.

<cfscript>
CategoryList = '1,2,3';
Categories = ormExecuteQuery("from Category where Id IN (:IdList)",{IdList=ListToArray(CategoryList)});
</cfscript>

If you know a better way please drop me a comment. I posted this in the Adobe Coldfusion forum for a few days but didn’t get anything.

Adding more resource navigator filters to ColdFusion Builder (Eclipse) Redux

There is a post at 12robots.com for how to add resource navigator filters to CFBuilder:

http://www.12robots.com/index.cfm/2010/8/10/Adding-more-resource-navigator-filters-to-ColdFusion-Builder-Eclipse

The solution below is similar, but does not involve accessing .jar files.

Step 1: Locate your version of CFBuilder by selecting “About Adobe ColdFusion Builder 2″.  Make a note of the Version and Build numbers.  For this post I am on Version: 2.0.0 and Build: 277745
Step 2: Locate the plugin.xml file in the com.adobe.ide.coldfusion.rcp_X.X.X.XXXXXX folder (Notice how X.X.X.XXXXXX corresponds to the Version and Build from Step 1):
com.adobe.ide.coldfusion.rcp_2.0.0.277745
Step 2: Locate the following section:
<extension
point="org.eclipse.ui.ide.resourceFilters">

Step 3: Add a block like this for each new filter you want:
<filter
pattern="_notes"
selected="true"/>

Step 4: Start CFBuilder from the command line.  For me on the Mac I execute the following command in Terminal:
"/Applications/Adobe ColdFusion Builder 2/CFBuilder.app/Contents/MacOS/CFBuilder" -clean
Step 5: Enjoy your new navigator filter(s).

Add a last modified date to FW/1 (Framework One) pages

Disclaimer:

  1. I’m a total newb to FW/1.
  2. There is most likely a better, or built in way to do this.

Still with me?  Ok.  Here is the specification for this little ditty:

  1. The site I’m working on is mostly static.
  2. It is required (perhaps legally, definitely procedurally) that every page of the site must have a last modified date in the footer.
  3. The site is built using FW/1 (which is awesome).

Here are the cliff notes of what’s about to go down:

  1. I have a footer that is included in every page.
  2. In the footer view Im going to look at the current page’s action in the request context (rc) and figure out what the corresponding “view” is based on the action
  3. I’m going to use cfdirectory to find the lastmodifieddate of the view file from step 2.

Without further adieu:


<!— Start with the path to our views folder —>
<cfset local.viewPath=”#VARIABLES.FRAMEWORK.BASE#views” />
<!— Make an array of rc.action (we use this to append subfolders) —>
<cfset local.arrAction=ListToArray(rc.action,”.”) />
<!— Set the counter to be 1 short of the action array len b/c the last member will be our view page —>
<cfset local.counter=ArrayLen(local.arrAction)-1 />
<!— Set the last member of our action array to be our action page —>
<cfset local.viewPage=”#local.arrAction[ArrayLen(local.arrAction)]#.cfm” />
<!— Append any subfolders to our viewPath —>
<cfloop from=”1″ to=”#local.counter#” index=”local.a”>
<cfset local.viewPath=”#local.viewPath#/#local.arrAction[local.a]#” />
</cfloop>
<!— Look for our viewPage cfm file in our viewPath —>
<cfdirectory action=”list”
directory=”#ExpandPath(local.viewPath)#”
name=”qGetLastdateModified”
filter=”#ListLast(local.viewPage, “/”)#”>
<!— If we have a record count then calculate the last modified date —>
<cfif qGetLastdateModified.recordCount>
<cfset local.siteLastUpdated=’#DateFormat(qGetLastdateModified.dateLastModified,”long”)# at #TimeFormat(qGetLastdateModified.dateLastModified,”hh:mm:ss tt”)#’ />
<cfelse>
<cfset local.siteLastUpdated=”unknown :- (” />
</cfif>
<cfoutput>#local.siteLastUpdated#</cfoutput>

Create a (ColdFusion) comic using iPhone apps

It’s no secret how I love my iPhone.  Further, it’s no secret either that I love ColdFusion and making silly cartoons around the office or home.  Time to roll it all up into one effort.

The Abbreviated How To:

  1. Take a couple of pictures on your iPhone
  2. Use the “ComicStrip” app to create the layout and captions
  3. Save the output from ComicStrip
  4. Open the image you just made in the “SketchMee” app
  5. Fiddle with the settings until you get the sketched look you like
  6. Save the output from SketchMee
  7. Post to the www

ColdFusion SOLR error: org/apache/pdfbox/pdmodel/PDDocument null

I got the following pretty obscure error the other day from a cfscheduler job that runs nightly to index documents uploaded to our site:

org/apache/pdfbox/pdmodel/PDDocument null

Turns out that the error is caused by a file having the extension of .PDF instead of .pdf.  No, really. Luckily I only had one offending file, but what if I had many? Also, what if users uploaded more after I renamed the problematic one? There are two parts to “future proofing” my situation. The first part it to address the .PDF extensions in the uploads. The second part, and what I’m going to pass on to you, is a custom tag that will look in a directory you specify and rename all .PDF extensions to .pdf.

To implement:

  • Download the pdf_cleanup custom tag
  • Unzip it to whatever directory you keep you custom tags in
  • Call it using the following syntax just before you run your <cfindex> operation(s):
    <cf_pdf_cleanup dirToClean="C:\mysuperdocs">

Be forewarned I take no responsibility for your use of the tag ;-)

Download the pdf_cleanup custom tag

Debugging ColdFusion 9 on shared hosting

With ColdFusion 9 debugging can be enabled on a page by page basis. This is super handy in a shared hosting environment where you don’t have access to the CFADMIN.

Step 1

Set debuggingipaddress and enablerobustexception in the THIS scope of your Application.cfc.  You can use http://www.whatismyip.com if you don’t know your ip address.

	<!--- define a debugging ip --->
	<cfset this.debuggingipaddresses="xxx.xxx.xxx.xxx">
	<!--- enable robust exception --->
	<cfset this.enablerobustexception="yes">

Step 2

Enable show debug output at the top of your page’s code.

	<!--- enable show debug output --->
	<cfsetting showdebugoutput="true">

You should now see your debugging info appended to the page.

Just to verify!

You can verify debugging is enabled by outputting the value of IsDebugMode().

	<!--- Is debugging on?  Should be yes when showdebugoutput="true" --->
	<cfoutput>#IsDebugMode()#</cfoutput>