在ColdFusion中使用JavaScript设置会话变量

时间:2013-04-09 21:29:30

标签: coldfusion coldfusion-9 cfwheels

我有一个包含多个标签的网站。每个选项卡根据一组过滤器运行单独的报告,这些过滤器从会话变量中获取它们的值。

现在的工作方式:

当用户在报告选项卡中时,他们可以打开过滤器菜单以选择运行报告所需的选项(医生姓名,位置,日期等),然后他们可以点击运行按钮获取他们的报告。当用户点击“运行”时,表单会将变量保存在会话中,以便运行其他报表,而无需单击“运行”或一次又一次地定义它们。

我要做的是:

我不需要在表单中只有一个“运行”按钮,而是需要一个“应用”按钮,它将从表单中设置会话变量而不运行当前报表。这样,用户可以预先定义他们的变量,而不必被迫运行他们不需要的报告。

我尝试使用ajax调用我的应用程序之外的函数,该函数根据用户的选择设置变量。

我的挑战是以某种格式从函数中恢复这些变量,我可以在更新当前会话变量时使用它们。

这是我的代码示例:

“应用”按钮:

<a href="#" id="okbutton" class="savebuttons close-reveal-modal" onclick="setSession();">Apply</a>

我的Ajax功能:

function setSession(){
    var formData = $('form').serialize();

    $.ajax({
        url:'/mod_example/components/exampleCFCs/xUtility.cfc?method=setSessionVariables',
        data: formData
    }); 
};

我的部分功能:

<cfcomponent output="no">
    <cffunction name="setSessionVariables" access="remote" returntype="any">
        <cfargument name="docid" type="string" required="no">

        <cfif isDefined('docid')>
            <cfset session.doctorids = docid>
        </cfif>

        <cfif isDefined('docid')> 
            <cfreturn session.doctorids>
        <cfelse>
            <cfreturn 0>
        </cfif> 
    </cffunction>
</cfcomponent>

我需要的是获得session.doctorids的值,以便能够使用新值更新会话变量。

1 个答案:

答案 0 :(得分:1)

听起来你在共享目录中有这个实用程序cfc并且你直接调用它。正如您所注意到的,问题在于您最终会遇到多个会话。你可以解决这个问题,在你的应用程序中设置一个Facade cfc,并对你的cfc进行ajax调用。

如果您只想公开setSessionVariables,那么您可以使用此cfc:

<cfcomponent output="no">
    <cffunction name="setSessionVariables" access="remote" returntype="any">
        <cfset var xUtility = createObject('component','mod_example.components.exampleCFCs.xUtility')>
        <cfreturn xUtility.setSessionVariables(argumentCollection=ARGUMENTS)>   
    </cffunction>
</cfcomponent>

如果要公开实用程序cfc的所有方法,则可以扩展它:

<cfcomponent output="no" extends="mod_example.components.exampleCFCs.xUtility">
</cfcomponent>

这将允许您在维护单个会话范围(当然是每个用户)的同时调用实用程序cfc上的方法。

编辑: 已经有一段时间了,因为我在车轮上工作......但我记得不喜欢车轮框架中的AJAX。如果您创建一个新的子文件夹并将其称为“远程处理”并将外观放在那里,并将application.cfc放在那里,如下所示:

<cfcomponent >
    <cfset this.name = 'whatever_your_wheels_app_name_is'>
    <cfset this.SessionManagement=true> 
</cfcomponent>

您应该能够使用该Facade,这个application.cfc将依赖于具有相同名称的现有应用程序。这种方法的问题是如果应用程序超时,并且远程调用是对应用程序的第一个请求,那么轮子应用程序范围可能无法正确设置。

最好是扩展根application.cfc并覆盖onRequestStart方法,以便框架忽略该请求。为此,您需要在cfadmin中将映射映射到项目的根目录,并将其用于远程处理/ application.cfc

<cfcomponent extends="mappingName.Application">
    <cffunction name="onRequestStart"> 
        <cfargument name="requestname" required="true" />

        <cfset structDelete(this,'onRequest')>
        <cfset structDelete(this,'onRequestEnd')>
        <cfset structDelete(VARIABLES,'onRequest')>
        <cfset structDelete(VARIABLES,'onRequestEnd')>

        <cfreturn true>
    </cffunction>
</cfcomponent>

车轮在整个地方使用“cfinclude”的方式,您可能需要查看有关扩展应用的帖子:http://techblog.troyweb.com/index.php/2011/09/cfwheels-workarounds-numero-uno-application-proxy/

有一些轮子插件(http://cfwheels.org/docs/1-1/chapter/wheels-ajax-and-you)允许你通过ajax使用控制器动作/视图/路线,所以你也可以查看这些插件。