我希望能够在Salesforce站点页面中读取/写入一些变量到当前会话。
我有一个使用Salesforce Sites构建的网站,我需要在所有页面上存储/检索一些值(考虑到我正在构建类似于购物车的东西)。 但是我找不到任何关于如何读取和写入会话变量的好例子(匿名用户)。
我正在使用具有在Apex中构建的多个控制器的Visualforce页面。
此致
答案 0 :(得分:4)
如果您正在构建类似购物车或“向导”的东西,您需要将控制器变量保持在从一个页面视图到另一个页面视图的上下文中,那么在VisualForce中执行此操作的最佳方法是使用相同的控制器。
当用户提交表单(通过actionFunctions,commandButtons或commandLinks等),并且您的控制器返回页面Reference时,如果新的可视化强制页面使用相同的控制器,则保留视图状态。
通过这种方式,您可以让用户在第一页上使用apex:inputField标签输入他们的姓名和电子邮件地址。它们导航到第二页,它使用与第一页相同的控制器,页面可以引用相同的控制器变量。本质上,控制器仍然在范围内,所有变量都是更新。
示例:
第一页:
<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>
第二页:
<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;
}
}
答案 1 :(得分: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 Custom Settings documentation。
答案 2 :(得分:0)
我认为Visualforce View State可能对您有用:
包含表单组件的Visualforce页面还包含一个加密的隐藏表单字段,该字段封装了页面的视图状态。此视图状态是自动创建的,顾名思义,它保存页面的状态 - 包含组件,字段值和控制器状态的状态。
答案 3 :(得分:0)
您应该使用Javascript cookies。
您也可以使用Apex cookies,但是您需要确保每个请求都在服务器上(而不是缓存层)。
对于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();
}