Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 341
  • Last Modified:

How do I invoke a function using a button in coldfusion?

I have the following function which I need to invoke using a "download" button. The download button is located just below a cfgrid. The function will output an Excel file when supplied with data.

1. How do I invoke the function when a user clicks the download button?
2. How do I supply the full dataset and not just what is available in the current page of the cfgrid?
<cffunction name="generateExcel" output="Yes" access="remote">
		<cfargument name="theQuery" type="query">
		<cfargument name="columnList" type="string" default="">
		<cfargument name="mode" type="string" default="display">
		<cfargument name="theFilename" type="string" default="clients_admin.xls">
 
		<cfset var TAB = chr(9)>
		<cfset var i = 1>
		<cfset var headerArray = ArrayNew(1)>
 
      <cfquery name="getClientsAdmin" datasource="#THIS.dsn#">
	  		SELECT *
			FROM    Clients
        </cfquery>
 
 
        <cfquery name="getClients" datasource="#THIS.dsn#">
			SELECT *
			FROM Clients WHERE owner = <cfqueryparam value="#SESSION.MM_Username#" cfsqltype="cf_sql_clob" maxlength="10"> 
        </cfquery>
		
		
		<cfsetting enablecfoutputonly="Yes">
		
		<!--- Dump all content before this fn call --->
		<cfcontent reset="yes">
		
		<!--- Use the full column list, if none is provided --->
		<cfif Len( ARGUMENTS.columnList ) IS 0>
			<cfset ARGUMENTS.columnList = ARGUMENTS.theQuery.columnList>
		</cfif>
		
		<cfswitch expression="#ARGUMENTS.mode#">
			<cfcase value="display">
				<cfif NOT isdefined("REQUEST.headerDoneFlag")>
					<cfset REQUEST.headerDoneFlag = true>
					<CFHEADER NAME="Content-Disposition" VALUE="inline; filename=""#ARGUMENTS.theFilename#""">
					<CFCONTENT TYPE="application/msexcel">
				</cfif>
			</cfcase>
			<cfcase value="save">
				<cfset guid = CreateUUID()>
				<cfset filename = GetDirectoryFromPath(GetCurrentTemplatePath()) & "temp_" & guid & ".xls">
				<cfset REQUEST.headerDoneFlag = true>
				<cfheader name="Content-type" value="application/octet-stream"> 
				<cfheader name="Content-Disposition" value="attachment;filename=""#ARGUMENTS.theFilename#""">
				<cfsavecontent variable="output">
					<cfset generateExcel( ARGUMENTS.theQuery, ARGUMENTS.columnList, "save" )>
				</cfsavecontent><cfoutput>#output#</cfoutput><cfabort>
				<cffile action="WRITE" file="#filename#" output="#output#">
				<cfcontent type="application/msexcel" file="#filename#" deleteFile="Yes">
			</cfcase>
			<cfcase value="debug">
				<cfoutput><pre></cfoutput>
			</cfcase>
			<cfdefaultcase>
				<cfthrow message="Mode must be either 'display', 'save', or 'debug'.">
			</cfdefaultcase>
		</cfswitch>
		
		<!--- Write the header row --->
		<cfloop index="i" from="1" to="#ListLen( columnList )#">
			<cfset item = Trim( ListGetAt( columnList, i ) )>
			<cfset headerArray[ ArrayLen( headerArray )+1 ] = item>
			<cfoutput>#item##TAB#</cfoutput>
		</cfloop>
		<cfoutput>#chr(13)#</cfoutput>
		
		<!--- Write all the sub rows --->
		<cfloop query="ARGUMENTS.theQuery">
		
			<cfloop index="i" from="1" to="#ArrayLen( headerArray )#">
				<cfset dbVal = Trim( ARGUMENTS.theQuery[headerArray[i]][CurrentRow] )>
				<cfif IsDate( dbVal )>
					<cfset dbVal = DateFormat( dbVal, "mm/dd/yyyy" )>
				<cfelse>
					<cfset dbVal = replaceList(dbVal,"#TAB#,#chr(10)#,#chr(13)#"," , , ")>
				</cfif>
				<cfoutput>#dbVal##TAB#</cfoutput>
			</cfloop>
			
			<cfoutput>#chr(13)#</cfoutput>
		
		</cfloop>
		
		<cfif ARGUMENTS.mode EQ "debug">
			<cfoutput></pre></cfoutput>
		</cfif>
		
		<cfsetting enablecfoutputonly="No">
	</cffunction>

Open in new window

0
futr_vision
Asked:
futr_vision
  • 4
  • 2
1 Solution
 
srikanthmadishettiCommented:
use cfjaxproxy onclick event.
0
 
futr_visionAuthor Commented:
Thanks. But my problem is that i am extremely new to ColdFusion and cfjaxproxy is greek to me.  I'll need a little more detail on how to accomplish this.
0
 
srikanthmadishettiCommented:
0
Easily Design & Build Your Next Website

Squarespace’s all-in-one platform gives you everything you need to express yourself creatively online, whether it is with a domain, website, or online store. Get started with your free trial today, and when ready, take 10% off your first purchase with offer code 'EXPERTS'.

 
futr_visionAuthor Commented:
Hmmm. Doesn't look like what I am trying to do. All I really need is the code and the place to put it to hook this function up.
0
 
futr_visionAuthor Commented:
Looking at this a little further i don't think cfajaxproxy will work for me. My download link/button is outside of the grid and needs to return the entire recordset. To me this simple means creating a way of calling the function and passing query data to it for it to do its thing. I just don't know how to do it.
0
 
futr_visionAuthor Commented:
Here is where I am at. I have some code that invokes the function and a cfc with the function. The invoke is pasted below and the function is in my original message except it is surrounded by the cfcomponent tag.
<cfquery name="customerDownload" datasource="THIS.dsn">
	Select *
	From Customers
</cfquery>
 
<cfinvoke component="CFC.ExcelDownload" method="generateExcel">
	<cfinvokeargument name="theQuery" value="#customerDownload#">
</cfinvoke>

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now