0

複数のタブを持つ Web サイトがあります。各タブは、セッション変数から値を取得する一連のフィルターに基づいて個別のレポートを実行します。

現在の仕組み:

ユーザーがレポート タブ内にいる間、フィルター メニューを開いて、レポートを実行するために必要なオプション (医師の名前、場所、日付など) を選択し、実行ボタンを押してレポートを取得できます。ユーザーが「実行」をクリックすると、フォームは変数をセッション内に保存し、「実行」をクリックしたり何度も定義したりすることなく他のレポートを実行できます。

私がやろうとしていること:

フォーム内に「実行」ボタンしかない代わりに、現在のレポートを実行せずにフォームからセッション変数を設定する「適用」ボタンが必要です。このようにして、ユーザーは、必要のないレポートを強制的に実行することなく、変数を事前に定義できます。

ユーザーの選択に基づいて変数を設定するアプリケーション外の関数を呼び出す 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 呼び出しを行うことで、この問題を回避できます。

のみを公開したい場合は、次のsetSessionVariablescfc を使用できます。

<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 は同じ名前の既存のアプリケーションにピギーバックします。このアプローチの問題は、アプリケーションがタイムアウトし、リモート呼び出しがアプリケーションへの最初の要求である場合、wheels アプリケーション スコープが適切に設定されない可能性があることです。

onRequestStartフレームワークがリクエストを無視するように、ルートの application.cfc を拡張してメソッドをオーバーライドできれば最高です。そのためには、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-アプリケーション-プロキシ/

ajax 経由でコントローラー アクション / ビュー / ルートを使用できるようにするホイール プラグイン ( http://cfwheels.org/docs/1-1/chapter/wheels-ajax-and-you )がいくつかあります。また。

于 2013-04-10T13:43:15.307 に答える