0

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

现在情况如何:

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

我正在尝试做的事情:

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

我尝试使用 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能够用新值更新我的会话变量的值。

4

1 回答 1

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>

您应该能够使用该外观,并且此 application.cfc 将搭载在具有相同名称的现有应用程序上。这种方法的问题是,如果应用程序超时,并且远程调用是对应用程序的第一个请求,那么 Wheels 应用程序范围可能无法正确设置。

如果您可以扩展根 application.cfc 并仅覆盖该onRequestStart方法,这样框架将忽略该请求,那将是最好的。为此,您需要在 cfadmin 中映射到项目的根目录,并将其用于您的 remoting/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-应用程序代理/

有一些轮子插件(http://cfwheels.org/docs/1-1/chapter/wheels-ajax-and-you)允许您通过 ajax 使用控制器操作/视图/路由,因此您可以查看这些还。

于 2013-04-10T13:43:15.307 回答