futr_vision
asked on
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?
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>
use cfjaxproxy onclick event.
ASKER
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.
ASKER
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.
ASKER
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.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.