Установка переменных сеанса с помощью 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 чтобы иметь возможность обновить мои переменные сеанса с новым значением.

1 ответ

Решение

Похоже, у вас есть эта утилита cfc в общем каталоге, и вы вызываете ее напрямую. Как вы заметили, проблема в том, что вы заканчиваете несколькими сессиями. Вы можете обойти эту проблему, настроив Facade cfc в своем приложении и сделав ajax-вызовы этому 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>

Если вы хотите выставить все методы утилиты cfc, то вы можете расширить ее:

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

Это позволит вам вызывать методы в утилите cfc, сохраняя при этом одну область сеанса (конечно, для каждого пользователя).

РЕДАКТИРОВАТЬ: Прошло некоторое время, так как я работал на колесах... но я помню, что мне не нравился AJAX в рамках колес. Если вы создадите новую подпапку и назовете ее "remoting", поместите туда фасад и добавите туда application.cfc, который выглядит следующим образом:

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

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

Было бы лучше, если бы вы могли расширить корневой файл 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-application-proxy/

Есть несколько плагинов для колес ( http://cfwheels.org/docs/1-1/chapter/wheels-ajax-and-you), которые позволяют вам использовать действия / представления / маршруты контроллера через ajax, чтобы вы могли изучить эти также.

Другие вопросы по тегам