我有一个包含多个标签的网站。每个选项卡根据一组过滤器运行单独的报告,这些过滤器从会话变量中获取它们的值。
现在的工作方式:
当用户在报告选项卡中时,他们可以打开过滤器菜单以选择运行报告所需的选项(医生姓名,位置,日期等),然后他们可以点击运行按钮获取他们的报告。当用户点击“运行”时,表单会将变量保存在会话中,以便运行其他报表,而无需单击“运行”或一次又一次地定义它们。
我要做的是:
我不需要在表单中只有一个“运行”按钮,而是需要一个“应用”按钮,它将从表单中设置会话变量而不运行当前报表。这样,用户可以预先定义他们的变量,而不必被迫运行他们不需要的报告。
我尝试使用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
的值,以便能够使用新值更新会话变量。
答案 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使用控制器动作/视图/路线,所以你也可以查看这些插件。