我试图根据配置页面上设置的值动态地在application.cfc上设置this.customTagPaths变量。这是因为我的开发人员的customTagPaths与他们在实际站点上的不同,我不想每次部署到实际站点时都必须更改值。我也无法通过现场网站上的CF管理员设置自定义标记路径,因为我无法控制实时CF服务器。如果我在onApplicationStart()中设置了该值,我发现该值未被识别:
<cffunction name="OnApplicationStart"...
<!---application.customTagPaths is set on the config page. On dev, this value is "C:/Inetpub/wwwroot/mySite/components/"--->
<cfinclude template = config/appsettings.cfm">
<cfset this.customTagPaths = application.customTagPaths>
使用上面的代码,我得到一个&#34;找不到组件&#34;我尝试在cfm页面上实例化对象时出错:
<cfset session.user = createObject("component", "user").init()>
所以我想我的问题的答案是&#34;没有&#34;。我想这个原因就是&#34;这个&#34; onApplicationStart()内部的范围是函数的本地范围,与&#34; this&#34;不同。用于设置this.name和this.applicationTimeout等的范围。我可以在application.cfc页面的顶部做appinctings.cfm的cfinclude,并在它下面设置this.customTagPaths:
<cfcomponent>
<cfinclude template="config/appsettings.cfm">
<cfset this.Name="myApp">
<cfset this.customTagPaths = application.customTagPaths>
...
这有效,但这是理想的吗?
答案 0 :(得分:2)
正如您所发现的那样,您最初的问题的答案是否定的 你后一个问题的答案是肯定的,这正是你应该如何做到的。除非您不使用Application范围参考。这些应用程序设置并未真正存储在应用程序范围中。
对于可能偶然发现此问题以便在Application.cfc文件中使用每个应用程序设置的其他人,您必须首先在ColdFusion Administrator的“设置”页面上启用每个应用程序设置。然后,您可以在Application.cfc文件中设置映射或自定义标记路径,如下所示。
Documentation reference for specifying settings per application
每个应用程序设置中的自定义标记会覆盖ColdFusion Administrator中定义的标记。例如,如果您有两个同名的自定义标记,并且它们位于“管理员”和“每个应用程序”设置中的不同位置,则会首先采用每个应用程序设置中的一个。
注意:仅在使用Application.cfc文件的应用程序中支持每个应用程序设置,而不是在使用Application.cfm文件的应用程序中。如果在管理员的“内存变量”页面中禁用了应用程序变量,则每个应用程序设置不起作用。
为每个应用设置自定义标记路径
- 检查ColdFusion Administrator的“设置”页面上的“启用每个应用程序设置”选项。
- 在Application.cfc文件中包含如下代码:
醇>
<cfset customtagpaths = "c:\mapped1,c:\mapped2">
<cfset customtagpaths = ListAppend(customtagpaths,"c:\mapped3")>
<cfset This.customtagpaths = customtagpaths>
答案 1 :(得分:1)
好的,我知道问题是什么。在我的onRequestStart()函数中,我有一个用于重置应用程序的if块:
<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false" hint="Fires at first part of page processing.">
<cfargument name="template" type="string" required="true" />
<cfsetting requesttimeout="20" showdebugoutput="#THIS.showDebug#" enablecfoutputonly="false" />
<cfset request.dsn = application.dsn>
<!---ability to restart app without restarting the CF server--->
<cfif THIS.mode EQ "dev" AND structKeyExists(url, "$$resetApp$$") AND url.$$resetapp$$ EQ 1>
<cfset structClear(application)>
<cfset structClear(this)>
<cfset onApplicationStart()>
</cfif>
我设置的这个范围变量在if之前是可用的,但是因为我清除了这个和应用程序范围,所以这些变量在if块之后被擦除并且不可用。所以我做的是这样的: 1.将配置文件的cfinclude放在页面顶部。 2.在该文件中设置我的“this”变量。由于它是一个包含,它与application.cfc上的代码基本相同,因此不需要在其中设置任何应用程序范围变量。这会解决我的customTagPaths问题。 3.我希望在此范围内使用站点范围内的任何内容(例如this.dsn),另存为页面顶部的应用程序范围var。 4.在onRequestStart()中,在if块之前引用this.showDebug和application.dsn,它将清除this和application范围。
直观地说,我更喜欢在onApplicationStart()中设置this.customTagPaths,所以它只设置一次(当应用程序启动时),但这不起作用;显然,该函数在页面顶部的任何此范围变量设置之前触发。