2013-04-09 5 views
0

У меня есть сайт с несколькими вкладками. Каждая вкладка запускает отдельный отчет на основе набора фильтров, которые принимают свои значения из переменных сеанса.Установка переменных сеанса с JavaScript в ColdFusion

Как это работает в настоящее время:

Пока пользователь находится внутри вкладки отчета они могут открыть меню фильтра для выбора параметров, которые они должны выполнить свой отчет (имена врача, места, дату и т.д.) и затем они могут нажать кнопку запуска, чтобы получить отчет. Когда пользователь нажимает «запустить», форма сохраняет переменные внутри сеанса, где они доступны для запуска других отчетов, без необходимости «запускать» или определять их снова и снова.

То, что я пытаюсь сделать:

Вместо того, чтобы только кнопку «запустить» внутри формы мне нужна кнопка, которая будет устанавливать сеансовые переменные из формы без запуска текущего отчета «Применить» , Таким образом, пользователь может заранее определить свои переменные, не будучи вынужденным запускать отчет, который им не нужен.

Я попытался использовать 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

Так что же не работает? Мне кажется, что ваш код должен устанавливать для вас переменную сеанса. –

+0

Когда вы говорите «вне моего заявления», что вы имеете в виду? Для каждого приложения задаются переменные сеанса. Если вы запускаете что-то за пределами вашего приложения, вы устанавливаете переменные сеанса для другого приложения. –

+0

cfc, устанавливающий переменные сеанса, находится под общей папкой cfc вне приложения. – Geo

ответ

1

Похоже, что у вас есть эта утилита cfc в общей папке, и вы вызываете ее напрямую. Как вы заметили, проблема заключается в том, что вы закончили несколько сеансов. Вы можете обойти эту проблему - настроить факс cfc в своем приложении и сделать ваши айакс-вызовы для этого cfc.

Если вы хотите, чтобы выставить setSessionVariables, то вы можете использовать этот КЧХ:

<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, сохраняя при этом единую область сеанса (для каждого пользователя, конечно).

EDIT: Прошло некоторое время с тех пор, как я работал в колесах ... но я не помню, чтобы AJAX не нравился в каркасе колес. Если вы создадите новую подпапку и назовете ее «удалением» и поставьте там фасад и отпустите приложение.ХФ в то, что выглядит следующим образом:

<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

+0

@Geo обновленный ответ с некоторой информацией для CFWheels & AJAX – jhinkley

+0

Большое спасибо! Мне не нужны все обновленные части вашего решения, просто часть application.cfc, чтобы позволить мне использовать сеансы. Ссылки, которые вы предоставили, также очень полезны! – Geo