我试图根据配置页面上的一个值动态地在application.cfc上设置application.cfc变量。这是因为我的开发工具上的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>使用上面的代码,当我试图在cfm页面上实例化一个对象时,我会得到一个“无法找到组件”错误:
<cfset session.user = createObject("component", "user").init()>因此,我想我的问题的答案是“不”。我认为这是因为onApplicationStart()中的" this“作用域是函数的本地作用域,而不是用于设置this.name和this.applicationTimeout等的"this”作用域。我可以在appsettings.cfm页面的顶部完成application.cfc的cfinclude,并在其下面设置this.customTagPaths:
<cfcomponent>
<cfinclude template="config/appsettings.cfm">
<cfset this.Name="myApp">
<cfset this.customTagPaths = application.customTagPaths>
...这是可行的,但这是理想吗?
发布于 2015-04-07 18:59:09
你最初的问题的答案是否定的,正如你所发现的。
对后一个问题的回答是肯定的,这正是你应该怎么做的。但您将不使用应用程序范围引用。这些应用程序设置实际上并不存储在应用程序范围中。
对于可能会遇到这个问题的其他人,为了在Application.cfc文件中使用每个应用程序设置,您必须首先在ColdFusion管理员的设置页面上启用每个应用程序设置。然后在Application.cfc文件中设置映射或自定义标记路径,如下所示。
每个应用程序设置中的自定义标记覆盖在ColdFusion管理员中定义的标记。例如,如果您有两个同名的自定义标记,并且它们位于Administrator和每个应用程序设置中的不同位置,则首先选择每个应用程序设置中的一个。 注意:仅在使用Application.cfc文件的应用程序中支持每个应用程序设置,而在使用Application.cfm文件的应用程序中则不支持。如果在“管理员”的“内存变量”页面中禁用了应用程序变量,则每个应用程序设置不起作用。 设置每个应用程序的自定义标记路径
<cfset customtagpaths = "c:\mapped1,c:\mapped2">
<cfset customtagpaths = ListAppend(customtagpaths,"c:\mapped3")>
<cfset This.customtagpaths = customtagpaths>
发布于 2015-04-07 19:18:35
好吧,我知道问题出在哪里了。在我的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>我设置的这个作用域vars在if块之前是可用的,但是由于我正在清除这个作用域和应用程序作用域,这些vars将在if块之后被删除和不可用。所以我所做的是: 1.将配置文件的cfinclude放在页面的顶部。2.在该文件中设置我的“此”vars。因为它是一个包含,所以本质上就像它的代码在application.cfc上一样,所以不需要在其中设置任何应用程序范围vars。这解决了我的customTagPaths问题。3.任何我想在此范围内使用站点的内容(比如this.dsn),都要将其保存为页面顶部的应用程序范围var。4.在onRequestStart()中,请在if块之前引用this.showDebug和application.dsn,这将清除此作用域和应用程序范围。
直观地说,我更喜欢在onApplicationStart()中设置onApplicationStart,所以它只设置了一次(当应用程序启动时),但这不起作用;显然,函数在页面顶部的任何一个范围vars设置好之前就会触发。
https://stackoverflow.com/questions/29497856
复制相似问题