variables - Coldfusion 11 - 全局变量 - Application.cfc 或 Application.cfm

标签 variables coldfusion global-variables coldfusion-11

我正在处理在 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&eacute;viation" />
        <cfset ui_lib_acces                     = "Acc&egrave;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>
  • 我创建了 application.cfc 并删除了 application.cfm 并尝试运行该应用程序。没关系,但是我在 ui_lib.cfm 中定义的变量出现了 Coldfusion 错误。服务器说 undefined variable 。你能告诉我为什么以及如何解决这个问题吗?
  • 我想知道是使用具有相同定义的文件 Application.cfc 还是保留当前文件 Application.cfm 更好?

  • 在此先感谢您的帮助。

    最佳答案

    我已经做了一些 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&eacute;viatio";
    application.languageStrings["FRA"]["ui_lib_acces"] = "Acc&egrave;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/

    相关文章:

    C++ - 我可以创建编译时变量对象吗?

    c++ - 规范化变量名 C/C++

    javascript - 增加变量名

    multithreading - 在不涉及先前数据计算的情况下更改变量是否是线程安全的?

    javascript - 全局变量替代

    javascript - 如何处理不同js文件中的两个同名变量?

    Java 和 JSR-223 在 Coldfusion 服务器上运行 Python(或 Ruby)代码

    struct - 有序结构中的最后一个键

    directory - 即使文件出现在源文件夹中,CFdirectory 标记也不显示目录中的文件

    c++ - 如何定义全局常量 (Q)Strings?