5

I want to be able to read / write some variables to the current session in my Salesforce site pages.

Salesforce サイトを使用して構築されたサイトがあり、すべてのページでいくつかの値を保存/取得する必要があります (ショッピング カートに似たものを構築していると考えてください)。ただし、変数をセッション(匿名ユーザー)に読み書きする方法の良い例は見つかりません。

Apex に組み込まれた複数のコントローラを含む Visualforce ページを使用しています。

よろしく

4

4 に答える 4

4

ショッピング カートや、あるページ ビューから別のページ ビューへのコンテキストでコントローラー変数を保持する必要がある「ウィザード」のようなものを構築している場合、VisualForce でこれを行う最善の方法は、同じコントローラーを使用することです。

ユーザーが (actionFunctions、commandButtons、または commandLinks などを介して) フォームを送信し、コントローラーがページ参照を返すと、新しい visual force ページが同じコントローラーを使用する場合、ビュー ステートは保持されます。

このようにして、たとえば、1 ページ目の apex:inputField タグを使用して、ユーザーに名前とメールアドレスを入力させることができます。彼らは、ページ 1 と同じコントローラを使用するページ 2 に移動し、ページは同じコントローラ変数を参照できます。基本的に、コントローラーは引き続きスコープ内にあり、更新されたすべての変数もスコープ内にあります。

例:

ページ 1:

<apex:page controller="myController">
   Please enter your name <apex:inputText value="{!shopper_name}"/>
   <br/>
   <apex:commandButton action="{!pageTwo}" value="Click for page two"/>
</apex:page>

2 ページ目:

<apex:page controller="myController">
   You entered: <apex:outputText value="{!shopper_name}" />.
</apex:page>

コントローラ:

public class myController {
  public string shopper_name { get; set; }
  public myController() {
    shopper_name = null;
  }
}
于 2011-02-11T06:34:20.720 に答える
3

カスタム設定はアプリケーション レベルでキャッシュされます。おそらくそれが上記のリンクで提案された理由です。そのアプローチをお勧めするかどうかはわかりませんが、それを機能させることができるかもしれません。

「SessionData」という名前のカスタム設定を作成し、カスタム フィールド (セッションに保存するデータを表す) を追加すると、次のようにデータを保存できます。

Database.SaveResult result = Database.insert(new SessionData__c(YourFieldHere='Your value here etc'));
System.debug(result.getID());

次に、結果のカスタム設定 ID を使用して Cookie に保存します。カスタム設定には通常の SOQL を使用してアクセスできますが、データがキャッシュされ、次のようにアクセスできるという利点があります。

if (SessionData__c.getAll().containsKey('unique ID from cookie here'))
{
     System.debug(SessionData__c.getInstance('unique ID from cookie here').YourFieldHere);
}

カスタム設定は実際にはこのように設計されていないことに注意してください。そのため、通常のセッション管理システムと同様に、古いカスタム設定データを定期的に削除する必要があります。

詳細については、Apex カスタム設定のドキュメントを参照してください。

于 2011-02-10T00:22:12.087 に答える
0

これにはJavascriptCookieを使用する必要があります。

Apex Cookieを使用することもできますが、その場合は、各リクエストがサーバーにヒットすることを確認する必要があります(キャッシュレイヤーではありません)。

Apex Cookieの場合、次のコードを使用できます。

//Setting Cookie
public void setCookie() {
    Cookie userCookie = new Cookie('CookieName', fieldValueToBeStoredAsCookie, null, 315569260, false); //Here 315569260 represents cookie expiry date = 10 years. You can set this to what ever expiry date you want. Read apex docs for more details.
    ApexPages.currentPage().setCookies(new Cookie[] {
        userCookie
    });
}

//Reading Cookie 
Cookie cookie = ApexPages.currentPage().getCookies().get('CookieName');
if (cookie != null) {
    String fieldValueToBeStoredAsCookie = cookie.getValue();        
}
于 2011-02-11T02:37:32.933 に答える
0

Visualforce View Stateが役立つと思います。

フォーム コンポーネントを含む Visualforce ページには、ページの表示状態をカプセル化する暗号化された非表示のフォーム フィールドも含まれます。このビュー ステートは自動的に作成され、その名前が示すように、ページの状態 (コンポーネント、フィールド値、およびコントローラーの状態を含む状態) を保持します。

于 2011-02-11T00:02:16.523 に答える