Using ColdFusion I am updating the top line of my txt file, however once I do this it adds an empty line after each line in my txt file and I have no idea why.
A breakdown of my code is as follows:
<!---CSV FILE--->
<cffile action="read" file="C:/ColdFusion10/cfusion/wwwroot/kelly2/debitorders.csv" variable="csvfile">
<cfoutput>
<!---LOOP THROUGH CSV FILE--->
<cfloop index="index" list="#csvfile#" delimiters="#chr(10)##chr(13)#">
<!---SET VALUES--->
<!---TRIM VALUES--->
<!---SET STRING LENGTH FOR EACH--->
<!---SET TOTAL STRING--->
<!---IF FILE FOR BANK EXISTS--->
<cfif FileExists(ExpandPath("#listgetAt('#index#',5)#.txt"))>
<!---READ EXISTING FILE HEADER--->
<cffile action="read" file="C:/ColdFusion10/cfusion/wwwroot/kelly2/#bankname#.txt" variable="bankheader">
<!---SPLIT UP THE HEADER TO ADD NEW VALUES ONTO IT--->
<cfset numericvalue = listfirst(bankheader,chr(13))>
<cfset numericvalue = #Right(numericvalue, 13)#>
<cfset RecordCountvalue = #Left(numericvalue, 3)#>
<cfset RecordCountvalue = #RecordCountvalue# + 1>
<cfset RecordCountvalue = #NumberFormat(RecordCountvalue,"000")#>
<cfset RecordCountvalue = #Left(RecordCountvalue, 3)#>
<cfset RecordCountvalue = #RJustify(RecordCountvalue, 3)#>
<cfset TotalRecordvalue = #Right(numericvalue, 10)#>
<cfset TotalRecordvalue = (#TotalRecordvalue# + #amount#) * 100000>
<cfset TotalRecordvalue = #NumberFormat(TotalRecordvalue,"0000000000")#>
<cfset TotalRecordvalue = #Left(TotalRecordvalue, 10)#>
<cfset TotalRecordvalue = #RJustify(TotalRecordvalue, 10)#>
<!---SET HEADER FOR FILE--->
<cfset fileheader_bank = "#UCase(bankname)#">
<cfset fileheader_bank = "#Left(fileheader_bank, 15)#">
<cfset fileheader_bank = "#LJustify(fileheader_bank, 16)#">
<cfset newfile_header = "#fileheader_bank##RecordCountvalue##TotalRecordvalue#">
<!---APPEND FILE AND ADD UPDATED HEADER--->
<cfset bankheader = listSetAt(bankheader,1,"#newfile_header#","#chr(13)#")>
<cffile action="write" file="#getDirectoryFromPath(getTemplatePath())#/#listgetAt('#index#',5)#.txt" output="#bankheader#">
<!---APPEND FILE AND ADD NEW ENTRY--->
<cffile action = "append"
file = "C:/ColdFusion10/cfusion/wwwroot/kelly2/#listgetAt('#index#',5)#.txt"
output = "#total_string#">
</cfif>
</cfloop>
</cfoutput>
I am pretty sure the problem is in one of these cffile tags.
<!---APPEND FILE AND ADD UPDATED HEADER--->
<cfset bankheader = listSetAt(bankheader,1,"#newfile_header#","#chr(13)#")>
<cffile action="write" file="#getDirectoryFromPath(getTemplatePath())#/#listgetAt('#index#',5)#.txt" output="#bankheader#">
<!---APPEND FILE AND ADD NEW ENTRY--->
<cffile action = "append"
file = "C:/ColdFusion10/cfusion/wwwroot/kelly2/#listgetAt('#index#',5)#.txt"
output = "#total_string#">
I have removed a lot of the unnecessary but if you need any of it please let me know.
If you used CFScript you would not have the issue. Because your using ColdFusion Tags returns and spaces affect document layout. Try minifiying your code to remove any floating returns / spaces. I have run into this issue with creating PDF files in CF
Related
<cfif NOT DirectoryExists(ExpandPath(lv_upload_path))>
<cfdirectory action="create" directory="#ExpandPath(lv_upload_path)#">
</cfif>
<cfset lv_file_ext = listLast(FORM.filename_inv, ".") />
<!--- replace special chars in comapny name except space, then replace space with underscore --->
<cfset company_name = replaceSpecialChars(
textString=FORM.company_name,
replaceTheseChars="33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,58,59,60,61,62,63,64,91,92,93,94,95,96,123,124,125,126"
)>
<cfset company_name = Replace( company_name, "#Chr(32)#", "_", "All" )>
<cfset lv_file_name = company_name & "_Factura_" & replaceSpecialChars(FORM.in_supplier_inv) & "_" & DateFormat(FORM.in_when_inv, "dd.mm.yyyy") >
<cfset lv_file_name_out = lv_file_name & "." & replaceSpecialChars(lv_file_ext)>
<cffile action="upload" filefield="pickfiles_inv" destination="#ExpandPath(lv_upload_path & '/' & lv_file_name_out)#" nameconflict="MakeUnique">
<cfset lv_document_name = CFFILE.serverfile />
<cfset new_id = APPLICATION.po_management.f_savePOInvDocuments(
p_po_inv_id=URL.id,
p_supplier_number=FORM.in_supplier_inv,
p_when_created=FORM.in_when_inv,
p_amount=FORM.in_amount_inv,
p_document_name=lv_document_name
Im new so if I make incorrect question, just help with how make it more good in future.
When upload a file give error back
Element FILENAME_INV is undefined in FORM.
Use the following line instead:
<cfset lv_file_ext = listLast(FORM.pickfiles_inv, ".") />
The following code changes the body BG dependent on if the /home url is active else use a different BG. We have the pageID = 206 containing the /home BG image and pageID = 207 containing the else BG image. We currently have it setup this way so the client can go into the CMS and change the BG image without an issue.
However, the client would like the ability to add additional backgrounds and have them randomize. In theory I would add a page to the CMS and include the pageID and add randomize. I'm familiar with ColdFusion but this is a little over my head. Any input or direction would be greatly appreciated.
<cfsavecontent variable="HOME_BG">
<cfoutput>
<cfset includeID = '206'><cfinclude emplate='/PageInclude/PageInclude.cfm'/>
</cfoutput>
</cfsavecontent>
<cfset BG1 = getToken(HOME_BG,3, """") >
<cfsavecontent variable="COMM_BG">
<cfoutput>
<cfset includeID = '207'><cfinclude template='/PageInclude/PageInclude.cfm'/>
</cfoutput>
</cfsavecontent>
<cfset BG2 = getToken(COMM_BG,3, """") >
<body onload="checkCookie()" style="background-image: url(<cfoutput><cfif fpath EQ "home">#BG1#<cfelse>#BG2#</cfif></cfoutput>);">
I was looking for the ability to randomize between two different < cfset > but didn't find much luck.
Solution using an array and randrange
<cfset bgHomeIDArray = ArrayNew(1)> <!--- Create the array --->
<cfset ArrayAppend(bgHomeIDArray, 214)> <!--- Adds an array value --->
<cfset ArrayAppend(bgHomeIDArray, 215)> <!--- Adds an array value --->
<cfsavecontent variable="HOME_BG">
<cfoutput>
<cfset includeID = bgHomeIDArray[randRange(1, len(bgHomeIDArray))]> <cfinclude template='/PageInclude/PageInclude.cfm'/>
</cfoutput>
</cfsavecontent>
<cfset BG1 = getToken(HOME_BG,3, """") >
<cfset bgCommIDArray = ArrayNew(1)> <!--- Create the array --->
<cfset ArrayAppend(bgCommIDArray, 216)> <!--- Adds an array value --->
<cfset ArrayAppend(bgCommIDArray, 217)> <!--- Adds an array value --->
<cfsavecontent variable="COMM_BG">
<cfoutput>
<cfset includeID = bgCommIDArray[randRange(1, len(bgCommIDArray))]><cfinclude template='/PageInclude/PageInclude.cfm'/>
</cfoutput>
</cfsavecontent>
<cfset BG2 = getToken(COMM_BG,3, """") >
<body onLoad="checkCookie()" style="background-image: url(<cfoutput><cfif fpath EQ "home">#BG1#<cfelse>#BG2#</cfif></cfoutput>?03202014);">
There is a new settings of Application.cfc in the coldfusion 10 which is:
this.smtpServersettings = as a structure
I can hard code the values here, but i am saving my mail settings in the database and i want to use those values here, is it possible or not to use the database settings here or not.
here is my Update:
<cfcomponent hint="File for the Website" output="false">
<cfsetting showdebugoutput="no">
<cfset this.name = "myProject1">
<cfset this.applicationTimeout = createTimeSpan(2,0,0,0)>
<cfset this.clientmanagement= "yes">
<cfset this.loginstorage = "session">
<cfset this.sessionmanagement = "yes">
<cfset this.sessiontimeout = CreateTimeSpan(0,0,40,0) />
<cfset this.setClientCookies = "yes">
<cfset this.scriptProtect = "all">
<cfset this.setDomainCookies = true>
<cfset this.customTagPaths = ExpandPath('customtags')>
<cfset this.datasource = {name="myDB"}>
<cfset this.smtpServersettings = {structur as username,password and mail settings}>
but that value needs to be through database, can you show me an example please
Yes, you should be able to set the value of the this.smtpServersettings variable from a database query. And for what it's worth, I think that setting as been available since ColdFusion 9.
All you would need to do is something like the following.
Run your query to get the values from the database
Create a new structure
Assign the three variables to that structure; server, username, and password
Assign the this.smtpServersettings variable to your new structure
Of course you will need to add some code to do something if/when your database query fails.
Update after the question was updated
Just do something like the following (pseudo code):
<cfcomponent hint="File for the Website" output="false">
<cfsetting showdebugoutput="no">
<cfset this.name = "myProject1">
<cfset this.applicationTimeout = createTimeSpan(2,0,0,0)>
<cfset this.clientmanagement= "yes">
<cfset this.loginstorage = "session">
<cfset this.sessionmanagement = "yes">
<cfset this.sessiontimeout = CreateTimeSpan(0,0,40,0) />
<cfset this.setClientCookies = "yes">
<cfset this.scriptProtect = "all">
<cfset this.setDomainCookies = true>
<cfset this.customTagPaths = ExpandPath('customtags')>
<cfset this.datasource = {name="myDB"}>
<!--- run your query here --->
<!--- check your query and do something appropriate if/when it fails --->
<cfset this.MyStructure = StructNew()>
<cfset this.MyStructure.server = this.MyQuery.ServerNameVariable>
<cfset this.MyStructure.username = this.MyQuery.UserNameVariable>
<cfset this.MyStructure.password = this.MyQuery.PasswordVariable>
<cfset this.smtpServersettings = this.MyStructure>
You also need to be aware that doing it this way will run that query on every page request. Make sure it runs fast.
I am taking a Word RTF file and then replacing data within in and then writing it to a specific folder and appending the requestID to the file name. That part works great. However, my client also want to be able to print each word document that is generated at the smae time if there are multiple records.
For this I am reading the same RTF file, replaceing the data within it and then writing to a seperate file that I am attempting to append too within the loop, however it isn't working. I am only getting one record of the query.
<cfloop query="checklistData">
<cffile action="read" file="#request.filePath#\_reports\fileChecklist.rtf" variable="rtf">
<cfset rtf = Replace(rtf,"%PROGRAM%",#rqst_activity#)>
<cfset rtf = Replace(rtf,"%DLA%",#DLA#)>
<cfset rtf = Replace(rtf,"%SPS%",#SPS#)>
<cfset rtf = Replace(rtf,"%ECAT%",#ECAT#)>
<cfset rtf = Replace(rtf,"%MILSTRIP%",#MILSTRIP#)>
<cfset rtf = Replace(rtf,"%TDPNUM%",#tdp_nbr#)>
<cfset rtf = Replace(rtf,"%DTRQST%",#DateFormat(dt_tdp_rcvd,'M/DD/YYYY')#)>
<cfset rtf = Replace(rtf,"%DTCMPT%",#DateFormat(dt_tdp_cmplt,'M/DD/YYYY')#)>
<cfset rtf = Replace(rtf,"%DTDEL%",#DateFormat(rqsted_delivery_dt,'M/DD/YYYY')#)>
<cfset rtf = Replace(rtf,"%UIC%",#DoDAAC#)>
<cfset rtf = Replace(rtf,"%COMMAND%",#COMMAND#)>
<cfset rtf = Replace(rtf,"%DTPRINT%",#DateFormat(NOW(),'M/DD/YYYY')#)>
<cfset rtf = Replace(rtf,"%NSN%",#nsn_id_rqsted#)>
<cfset rtf = Replace(rtf,"%NOMEN%",#nsn_nomenclature#)>
<cfset directoryCheck = "#request.filePath#\requests\documents\#checklistData.id_rqst#">
<cfif directoryExists(directoryCheck)>
<cffile action="write" file="#request.filePath#\requests\documents\#checklistData.id_rqst#\fileChecklist_#checklistData.id_rqst#.doc" output="#rtf#" nameconflict="overwrite">
<cfelse>
<cfdirectory action="create" directory="#directoryCheck#">
<cffile action="write" file="#request.filePath#\requests\documents\#checklistData.id_rqst#\fileChecklist_#checklistData.id_rqst#.doc" output="#rtf#" nameconflict="overwrite">
</cfif>
<cffile action="append" file="#request.filePath#\requests\documents\fileChecklistGroup_#ARGUMENTS.groupID#.rtf" output="#rtf#">
</cfloop>
<cfif NOT LEN('checklistData.groupID')>
<cfheader name="content-disposition" value="filename=#request.filePath#\requests\documents\#requestID#\fileChecklist_#requestID#.doc" />
<cfcontent type="application/msword" file="#request.filePath#\requests\documents\#requestID#\fileChecklist_#requestID#.doc">
<cfelse>
<cfheader name="content-disposition" value="filename=#request.filePath#\requests\documents\fileChecklistGroup_#groupID#.rtf" />
<cfcontent type="application/msword" file="#request.filePath#\requests\documents\fileChecklistGroup_#groupID#.rtf">
</cfif>
<cfabort>
And then I am asking to open the file at the end. Thanks in advance for an help!
I've just had a strange issue with a client's website, my live domain was using my development domains Application settings. I've not had this issue before, and removing cflock around the Application.dsn (amongst other settings) resolved the issue.
As mentioned I have a live site *www.* and development site *dev.*, my development site is in a subfolder of the live site /dev/ and has it's own Application.cfc.
My first question is, if I have variables in my Application scope in the dev folder will this overwrite the Application scope variables in the folder above? Will it consider it the same scope? If so, then this might explain what the issue and if not then I am stumped.
My second question is, how should I correct cflock application scope variables in my application.cfc? Should I be doing this at all?
Here is my Application.cfc, advice would be greatly appreciated:
<cfcomponent output="true">
<cfimport taglib="taglib" prefix="func">
<!---
Check staging directory exists
--->
<cfset THIS.env = "staging">
<!---
Set application vars
--->
<cfset THIS.applicationTimeout = createTimeSpan(0,0,0,0)>
<cfset THIS.sessionManagement="Yes">
<cfset THIS.clientManagement = true>
<cfset THIS.clientStorage = "cookie">
<cfset THIS.loginStorage = "cookie">
<cfset THIS.setDomainCookies = false>
<cfset THIS.setClientCookies = true>
<cfset THIS.scriptProtect = true>
<cfset THIS.secureJSON = true> <!--- Added 12.06.13 --->
<!---
Check environment
Set application name
--->
<cfif THIS.env EQ "staging">
<cfset THIS.applicationName = "devenv">
<cfset THIS.dsn = "devenv">
<cfelse>
<cfset THIS.applicationName = "liveenv">
<cfset THIS.dsn = "liveenv">
</cfif>
<cfif #cgi.HTTP_HOST# NEQ "localhost">
<cfset THIS.dirpath = "http://#cgi.http_host#">
<cfset THIS.componentPath = "cfcs.">
<cfelse>
<cfset urlString = #mid(cgi.PATH_INFO, 2, 200)#>
<cfset THIS.localhostFolderName = #spanexcluding(urlString, "/")#>
<cfset THIS.dirpath = "http://localhost/#THIS.localhostFolderName#">
<cfset THIS.componentPath = "#THIS.localhostFolderName#.cfcs.">
</cfif>
<cfset THIS.name = THIS.applicationName>
<cfset THIS.sessiontimeout = createtimespan(0,0,20,0)>
<cfset THIS.setClientCookies = true>
<cfset THIS.visitor = true>
<cffunction name="onApplicationStart" returntype="void">
<cfset APPLICATION.name = THIS.applicationName>
<cfset APPLICATION.dsn = THIS.dsn>
<cfset APPLICATION.DSN = THIS.dsn>
<cfset APPLICATION.dirpath = THIS.dirpath>
<cfset APPLICATION.componentPath = THIS.componentPath>
<cfif #cgi.HTTP_HOST# EQ "localhost">
<cfset APPLICATION.localhostFolderName = THIS.localhostFolderName>
</cfif>
<!--- USED FOR PATHS AND URLS --->
<!--- Property image upload paths ---->
<cfset APPLICATION.paths = StructNew()>
<!---
Check environment
Set local root
--->
<cfif THIS.env EQ "staging">
<cfset APPLICATION.paths.localRoot = "c:\websites\foobar.co.uk\dev\">
<cfelse>
<cfset APPLICATION.paths.localRoot = "c:\websites\foobar.co.uk\">
</cfif>
<cfset APPLICATION.paths.logs = APPLICATION.paths.localRoot & "logs\">
<cfset APPLICATION.paths.logFile = APPLICATION.paths.logs & "site_log.txt">
<cfset APPLICATION.paths.property = StructNew()>
<cfset APPLICATION.paths.property.image = APPLICATION.paths.localRoot & "images\property\">
<cfset APPLICATION.paths.property.large = APPLICATION.paths.property.image & "large\">
<cfset APPLICATION.paths.property.thumb = APPLICATION.paths.property.image & "thumbs\">
<cfset APPLICATION.paths.property.cmsThumb = APPLICATION.paths.property.image & "thumbs\cms\">
<cfset APPLICATION.paths.property.pdf = APPLICATION.paths.localRoot & "pdf\">
<cfset APPLICATION.paths.property.pdfGenerated = APPLICATION.paths.property.pdf & "generated\">
<cfset APPLICATION.newsUploadPath = APPLICATION.paths.localRoot & "images\news\">
<cfset APPLICATION.articlesUploadPath = APPLICATION.paths.localRoot & "images\articles\">
<cfset APPLICATION.articlesThumbsDir = "../images/articles/thumbs/">
<cfset APPLICATION.articlesContentDir = "../images/articles/assets/">
<cfset APPLICATION.articlesAssetsDir = "../articles/assets/">
<!--- Site URLS ---->
<cfset APPLICATION.urls = StructNew()>
<cfset APPLICATION.urls.root = "http://" & CGI.server_name & "/">
<cfset APPLICATION.urls.com = "com">
<cfset APPLICATION.urls.tagLib = APPLICATION.urls.root & "taglib/">
<cfset APPLICATION.urls.cms.tagLib = "http://" & CGI.server_name & ":" & CGI.server_port & "/admin/tagLib/">
<cfset APPLICATION.RowsPerPage = 10>
<!--- Property URLS --->
<cfset APPLICATION.urls.property.pdf = APPLICATION.urls.root & "pdf/">
<cfset APPLICATION.urls.property.image = APPLICATION.urls.root & "images/property/">
<cfset APPLICATION.urls.property.large = APPLICATION.urls.root & "images/property/large/">
<cfset APPLICATION.urls.property.thumb = APPLICATION.urls.root & "images/property/thumbs/">
<cfset APPLICATION.urls.property.cmsThumb = APPLICATION.urls.root & "images/property/thumbs/cms/">
<cfset APPLICATION.urls.news.image = APPLICATION.urls.root & "images/news/">
<cfset APPLICATION.urls.articles.image = APPLICATION.urls.root & "images/articles/">
<cflock scope="Application" timeout="5" type="Exclusive">
<cfscript>
/* Commonly used objects and queries */
// DAOs
APPLICATION.propertyDAO = CreateObject("component", "cfcs.dataobjects.propertyDAO").init(APPLICATION.dsn);
APPLICATION.propertyImageDAO = CreateObject("component", "cfcs.dataobjects.property_imageDAO").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyImageDAO = CreateObject("component", "cfcs.dataobjects.property_to_property_imageDAO").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyLocationDAO = CreateObject("component", "cfcs.dataobjects.property_to_property_locationDAO").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyTypeDAO = CreateObject("component", "cfcs.dataobjects.property_to_property_typeDAO").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyTenureDAO = CreateObject("component", "cfcs.dataobjects.property_to_property_tenureDAO").init(APPLICATION.dsn);
APPLICATION.propertyGroupDAO = CreateObject("component", "cfcs.dataobjects.property_groupDAO").init(APPLICATION.dsn);
// Gateways
APPLICATION.propertyGateway = CreateObject("component", "cfcs.dataobjects.propertyGateway").init(APPLICATION.dsn);
APPLICATION.propertyImageGateway = CreateObject("component", "cfcs.dataobjects.property_imageGateway").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyImageGateway = CreateObject("component", "cfcs.dataobjects.property_to_property_imageGateway").init(APPLICATION.dsn);
APPLICATION.propertyLocationGateway = CreateObject("component", "cfcs.dataobjects.property_locationGateway").init(APPLICATION.dsn);
APPLICATION.propertyImageGateway = CreateObject("component", "cfcs.dataobjects.property_imageGateway").init(APPLICATION.dsn);
APPLICATION.propertyTypeGateway = CreateObject("component", "cfcs.dataobjects.property_typeGateway").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyTypeGateway = CreateObject("component", "cfcs.dataobjects.property_typeGateway").init(APPLICATION.dsn);
APPLICATION.propertyTenureGateway = CreateObject("component", "cfcs.dataobjects.property_tenureGateway").init(APPLICATION.dsn);
APPLICATION.propertyToPropertyTenureGateway = CreateObject("component", "cfcs.dataobjects.property_to_property_tenureGateway").init(APPLICATION.dsn);
APPLICATION.partnerGateway = CreateObject("component", "cfcs.dataobjects.partnerGateway").init(APPLICATION.dsn);
// Business Objects
APPLICATION.propertyBO = CreateObject("component", "cfcs.businessobjects.propertyBO").init(APPLICATION.dsn);
// Common queries
APPLICATION.qPartners = APPLICATION.partnerGateway.getAllRecords();
APPLICATION.qPropertyTypes = APPLICATION.propertyTypeGateway.getAllRecords();
APPLICATION.qPropertyTenures = APPLICATION.propertyTenureGateway.getAllRecords();
APPLICATION.qPropertyMinMaxSize = APPLICATION.propertyGateway.getMinMaxSize();
APPLICATION.qPropertyLocations = APPLICATION.propertyLocationGateway.getAllRecords();
</cfscript>
</cflock>
</cffunction>
<cffunction name="onSessionStart" returntype="void">
<cflock scope="Session" timeout="5" type="Exclusive">
<cfscript>
SESSION.propertySearchCriteria = CreateObject("component", "cfcs.beans.property_search_criteria").init();
SESSION.propertySearch = CreateObject("component", "cfcs.beans.property_search").init(SESSION.propertySearchCriteria);
</cfscript>
</cflock>
</cffunction>
Why do you change your application name based on the environment it's in? That makes no sense. The application is still the same app, irrespective of whether it's in prod, or you're staging it, or developing it.
Equally, same with the source code. You've got your dev site within your live website? How does this make any sense?
I dunno what's going on with your application variables, but they're bound to the application name (this.name), not where the Application.cfc is in the directory structure.
I suspect your zero applicationTimeout is not helping matters much here. This basically means your application never actually persists... it'll be timing out every request. This makes no sense either.
You do not need to <cflock> that code in onApplicationStart(). ColdFusion will only allow one request to run onApplicationStart(): all other requests will be queued until it's completed, by which time the application has started, so the queued requests won't even attempt to run it.
I think your problem is most likely causes by your poor application framework design, and this weird thing you're doing having dev and prod in the same source code tree (which defies all logic).
Sort your source code out, and the problem won't arise.
You can use conditional logic to set your application name.
if ( YouAreHappy and YouKnowIt ) {
This.name = "ClapYourHands";
}
else {
This.name = "StompYourFeet";
}
In real life, your if condition would be something that differented the live and test environments. cgi.http_host is a good candidate.