我正在处理在 Coldfusion 9 中完成的应用程序。我必须在 CF11 中迁移它,我想改进代码。目前在CF9中的应用是这样完成的:
申请.cfm :
<cfapplication name="MyApp"
clientManagement="yes"
clientStorage="registry"
setClientCookies="yes"
sessionManagement="yes"
sessionTimeout="#CreateTimeSpan(0,1,0,0)#"
applicationTimeout="#CreateTimeSpan(0,0,2,0)#"
/>
<cfset application.datasource = "MyApp"/>
<cfset application.name = "MyApp"/>
<cfset application.access = "App"/>
<cfset application.version = "1.1"/>
<cfset application.title = "My Application"/>
<cfset application.inc_path = "includes"/>
<cfset application.com_path = "components"/>
<cfset application.scripts_path = "scripts"/>
<cfset application.styles_path = "styles"/>
<cfset application.email = "firstname.lastnane@myapplication.com" />
<cfset application.YEAR = 2016/>
<cfif Not IsDefined("session.language_cd")>
<cfset session.language_cd = "ENG">
</cfif>
<cfset session.email_support_team = "support@myapplication.com" />
<cfinclude template="ui_lib.cfm">
在文件“ ui_lib.cfm ”中,有很多在所有其他 .cfm 文件中定义和使用的变量:
<cfswitch expression="#session.ui_lng_cd#">
<cfcase value="FRA">
<cfset ui_lib_abbrev = "Abbréviation" />
<cfset ui_lib_acces = "Accès" />
<cfset ui_lib_active_sans_accent = "Actif" />
</cfcase>
<cfcase value="ENG">
<cfset ui_lib_abbrev = "Abbreviation" />
<cfset ui_lib_acces = "Access" />
<cfset ui_lib_active_sans_accent = "Active" />
</cfcase>
</cfswitch>
例如在 menu.cfm :
<div id="menu">
<h5><cfoutput>#session.user#</cfoutput></h5>
<ul>
<li><cfoutput>#ui_lib_abbrev#</cfoutput></li>
<li><cfoutput>#ui_lib_acces#</cfoutput></li>
<li><cfoutput>#ui_lib_active_sans_accent#</cfoutput></li>
</ul>
</div>
我试图创建一个 申请.cfc 替换 application.cfm :
<cfcomponent displayname="MyApp">
<cfset This.name = "MyApp">
<cfset This.sessionManagement="yes">
<cfset This.clientManagement="no">
<cfset This.loginStorage="session">
<cfset This.sessionTimeout = CreateTimeSpan(0,0,0,1)>
<cfset This.applicationTimeout = CreateTimeSpan(0,0,2,0) >
<cfset This.setClientCookies="no">
<cfset This.domainCookies="yes">
<cfset This.scriptProtect = "All">
<cffunction name="onApplicationStart">
<cfscript>
Application.homePage = "/index.cfm";
Application.datasource = "MyApp";
Application.name = "MyApp";
Application.access = "App";
Application.version = "1.1";
Application.title = "My Application";
Application.inc_path = "includes";
Application.com_path = "components";
Application.scripts_path = "scripts";
Application.styles_path = "styles";
Application.email = "firstname.lastnane@myapplication.com"
Application.YEAR = 2016;
</cfscript>
<cfinclude template="ui_lib.cfm">
</cffunction>
<cffunction name="onSessionStart">
<cfif Not IsDefined("session.language_cd")>
<cfset session.language_cd = "ENG">
</cfif>
<cfif Not IsDefined("session.g_exercice")>
<cfset todayDate = Now()>
<cfset SESSION.g_exercice = #DateFormat(todayDate, "yyyy")#>
</cfif>
<cfif Not IsDefined("session.sec_first_pass")>
<cfset SESSION.sec_first_pass = 0>
</cfif>
<cfset session.email_support_team = "support@myapplication.com" />
</cffunction>
</cfcomponent>
在此先感谢您的帮助。
最佳答案
我已经做了一些 cfm 到 cfc 的转换,答案取决于使用情况。如前所述,应用程序范围中基于 session 的逻辑将不起作用。
如果有一种方法可以更改用户的语言,从而更新 session.ui_lng_cd 值,从而更新向用户显示的语言,那么最简单的答案是在 OnRequestStart 事件中设置语言变量。您必须将变量的范围更改为 请求 设置和使用时的范围,但希望通过全局搜索和替换会很容易。
补充说明:
也可以通过将代码放在 OnSessionStart 事件中来将这些语言变量存储在 session 中,但通常最好将 session 存储保持在最低限度,就像您开始在一个繁忙的站点上的 session 中存储大量它可能用完一样很多内存。
执行此操作的另一种方法需要更多工作,但我认为如果您有很多这样的方法,效率会更高,那就是在应用程序中创建一个两级数组来存储语言字符串并使用 session 语言作为第一级键.这样,每次请求旧变量时只使用很少的内存。
所以在你的 application.cfc OnApplicationStart 你有:
application.languageStrings = {};
application.languageStrings["ENG"] = {};
application.languageStrings["ENG"]["ui_lib_abbrev"] = "Abbreviation";
application.languageStrings["ENG"]["ui_lib_acces"] = "Access";
application.languageStrings["ENG"]["ui_lib_active_sans_accent"] = "Active";
application.languageStrings["FRA"] = {};
application.languageStrings["FRA"]["ui_lib_abbrev"] = "Abbréviatio";
application.languageStrings["FRA"]["ui_lib_acces"] = "Accès";
application.languageStrings["FRA"]["ui_lib_active_sans_accent"] = "Actif";
并输出您将使用的正确字符串:
#application.languageStrings[session.language_cd]["ui_lib_active_sans_accent"]#
关于variables - Coldfusion 11 - 全局变量 - Application.cfc 或 Application.cfm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828955/