2013-04-09 76 views
0

我有一個包含多個選項卡的網站。每個選項卡基於一組過濾器運行單獨的報告,這些過濾器從會話變量中獲取其值。在ColdFusion中使用JavaScript設置會話變量

事情怎麼現在的工作:

當用戶在一個報表選項卡里面,他們可以打開過濾器菜單中選擇他們需要運行他們的報告(醫生名稱,位置,日期等)的選項然後他們可以點擊運行按鈕來獲得他們的報告。當用戶點擊「運行」時,表單會保存會話中的變量,以便運行其他報告,而無需點擊「運行」或一次又一次定義它們。

我所試圖做的事:具有表單內唯一的「運行」按鈕

相反,我需要一個「應用」按鈕,將設置表單中的會話變量,而當前運行的報告。這樣用戶可以預先定義他們的變量,而不必強迫他們運行他們不需要的報告。

我試過使用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

那麼有什麼不工作?它看起來像你的代碼應該爲你設置會話變量。 – 2013-04-10 12:29:10

+0

當你說,「在我的應用程序之外」,你是什麼意思?會話變量根據應用程序設置。如果您正在應用程序之外運行某些內容,則需要爲其他應用程序設置會話變量。 – 2013-04-10 13:10:51

+0

設置會話變量的cfc位於應用程序之外的常規cfc文件夾下。 – Geo 2013-04-10 14:30:56

回答

1

這聽起來像你有這個實用程序cfc在共享目錄中,你直接調用它。正如你已經注意到的那樣,問題在於你最終得到了多個會話。你可以繞過這個問題,在你的應用程序中設置一個Facade cfc,並對你的cfc進行ajax調用。

如果你只是想揭露setSessionVariables那麼你可以使用此CFC:如果你想揭露工具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> 

,那麼你可以擴展它:

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

這將允許您調用實用程序cfc上的方法,同時保持單個會話範圍(當然,每個用戶)。

編輯: 過去一段時間,因爲我在車輪工作......但我記得不喜歡AJAX在車輪框架。如果您創建一個新的子文件夾並將其稱爲「遠程處理」並將外觀置於其中,並刪除應用程序。CFC在那裏,看起來像這樣:

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

您應該能夠使用的門面,這會的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使用控制器操作/視圖/路線,所以你也可以看看這些。

+0

這聽起來像一個解決方案。這個組件去哪裏?在我的控制器的文件夾下? – Geo 2013-04-10 14:32:35

+0

@Geo更新了一些關於CFWheels&AJAX的信息 – jhinkley 2013-04-10 15:36:12

+0

非常感謝!我不需要解決方案的所有更新部分,只需要application.cfc部分就可以使用會話。您提供的鏈接也非常有幫助! – Geo 2013-04-10 16:10:39