salesforce 零基础学习(六十四)页面初始化时实现DML操作
有的时候我们往往会遇到此种类似的需求:用户在访问某个详细的记录时,需要记录一下什么时候哪个用户访问过此页面,也就是说进入此页面时,需要插入一条记录到表中,表有用户信息,record id,sObject name以及vf page name.但是对于salesforce,不允许在controller的构造函数中进行DML操作,此种情况推荐采用两种方式实现此功能:

一.使用apex:page的action属性
1. DetailGoodsUseAjaxToolkitController:实现数据的初始化以及提供方法实现log记录的插入操作
public with sharing class DetailGoodsUseAjaxToolkitController {
public DetailGoodsUseAjaxToolkitController() {
initData();
}
private Map<String,String> params;
public Goods__c goods{get;set;}
private void initData() {
params = ApexPages.currentPage().getParameters();
String goodsId = params.get('id');
goods = [SELECT Goods_Code_Unique__c, GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c,
GoodsName__c, GoodsPrice__c, GoodsProfit__c,Id FROM Goods__c
where id=:goodsId];
}
/*
* 用于apex:page绑定的action,执行完构造函数以后执行此方法
*/
public void createLog() {
Log_Info__c log = new Log_Info__c();
log.Access_Date__c = system.now();
PageReference pr = ApexPages.currentPage();
String relatedURL = pr.getUrl();
Integer startIndex = relatedURL.lastIndexOf('/') + 1;
Integer endIndex = relatedURL.indexOf('?') == -1 ? relatedURL.length() : relatedURL.indexOf('?');
String pageName = relatedURL.substring(startIndex,endIndex);
log.Access_Page__c = pageName;
log.Accessor__c = UserInfo.getUserId();
insert log;
}
}
2.DetailGoodsUseAction.page:实现页面绘画以及通过action调用后台方法实现DML操作
<apex:page controller="DetailGoodsUseAjaxToolkitController" action="{!createLog}">
<apex:form >
<apex:pageBlock title="Goods Information">
<apex:pageBlockSection title="Goods Basic Information">
<apex:outputText id="GoodsUniqueCode" value="{!goods.Goods_Code_Unique__c}"/>
<apex:outputText id="GoodsName" value="{!goods.GoodsName__c}"/>
<apex:outputText id="GoodsPrice" value="{!goods.GoodsPrice__c}"/>
<apex:outputText id="GoodsCostPrice" value="{!goods.GoodsCostPrice__c}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
二.使用ajax toolkit
ajax toolkit API : https://resources.docs.salesforce.com/204/latest/en-us/sfdc/pdf/apex_ajax.pdf
相关核心API:https://developer.salesforce.com/docs/atlas.en-us.204.0.api.meta/api/sforce_api_calls_list.htm
ajax toolkit基于SOAP 的API,简单的说即通过js调用soap api实现少量的数据的页面展示或者对少量数据进行DML操作,如果对于大数据处理,别使用此种方式。
使用ajax toolkit主要三个步骤:
1.Connecting to the API :
针对非自定义button的引入
<apex:page>
<script src="../../soap/ajax/38.0/connection.js" type="text/javascript"></script>
<script>
sforce.connection.sessionId='{!GETSESSIONID()}';
...
</script>
...
</apex:page>
针对自定义onclick javascript按钮的引入:
<body>
{!requireScript("/soap/ajax/38.0/connection.js")} ...
2.Embedding API Calls in JavaScript :在javascript中嵌入API,然后通过回掉函数进行函数成功或者失败的处理操作;
3.Processing Results:对结果进行处理。 如果进行的是查询操作,可以对查询列表进行相关处理或者执行queryMore等操作,如果是进行DML操作可以判断是否执行成功等。
使用Ajax Toolkit可以实现同步或者异步的调用,详情参看上方PDF。
官方demo如下:
<apex:page >
<script type="text/javascript">
var __sfdcSessionId = '{!GETSESSIONID()}';
</script>
<script src="../../soap/ajax/38.0/connection.js" type="text/javascript"></script>
<script type="text/javascript">
window.onload = setupPage;
function setupPage() { //function contains all code to execute after page is rendered
var state = { //state that you need when the callback is called
output : document.getElementById("output"),
startTime : new Date().getTime()
};
var callback = { //call layoutResult if the request is successful
onSuccess: layoutResults, //call queryFailed if the api request fails
onFailure: queryFailed,
source: state
};
sforce.connection.query( "Select Id, Name, Industry From Account order by Industry", callback);
} function queryFailed(error, source) {
source.output.innerHTML = "An error has occurred: " + error;
}
/** * This method will be called when the toolkit receives a successful
* response from the server.
* @queryResult - result that server returned
* @source - state passed into the query method call.
*/
function layoutResults(queryResult, source) {
if (queryResult.size > 0) {
var output = ""; //get the records array
var records = queryResult.getArray('records'); //loop through the records and construct html string
for (var i = 0; i < records.length; i++) {
var account = records[i];
output += account.Id + " " + account.Name + " [Industry - " + account.Industry + "]<br>";
} //render the generated html string
source.output.innerHTML = output;
}
}
</script> <div id="output"> </div>
</apex:page>
通过demo可以看出:通过api先进行query操作查出Industry表数据,然后进行callback回掉,callback执行success和error的相关处理从而实现数据的展示。
通过ajax toolkit实现log数据的插入
<apex:page controller="DetailGoodsUseAjaxToolkitController">
<apex:form >
<apex:pageBlock title="Goods Information">
<apex:pageBlockSection title="Goods Basic Information">
<apex:outputText id="GoodsUniqueCode" value="{!goods.Goods_Code_Unique__c}"/>
<apex:outputText id="GoodsName" value="{!goods.GoodsName__c}"/>
<apex:outputText id="GoodsPrice" value="{!goods.GoodsPrice__c}"/>
<apex:outputText id="GoodsCostPrice" value="{!goods.GoodsCostPrice__c}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form> <script type="text/javascript">
var __sfdcSessionId = '{!GETSESSIONID()}';
</script>
<script src="/soap/ajax/38.0/connection.js" type="text/javascript"></script>
<script src="/soap/ajax/38.0/apex.js" type="text/javascript"></script>
<script type="text/javascript">
window.onload = setupPage;
function setupPage() {
var logInfo = new sforce.SObject("Log_Info__c");
logInfo.Accessor__c = "{!$User.Id}";
var accessDate = new Date("{!NOW()}");
logInfo.Access_Date__c = accessDate;
logInfo.Access_Page__c = "{!$CurrentPage.Name}";
var result = sforce.connection.create([logInfo]);
if (result[0].getBoolean("success")) {
//do success process
} else {
//do error process
}
}
</script>
</apex:page>
此种方式运行效果:
1.Log_Info__c最开始没有任何数据

2.访问当前页面

3.访问页面后数据库便存储了一条当前访问者访问的页面的Log数据

注意:此种方式对于谷歌浏览器会有一个问题,使用谷歌浏览器访问会出现Refused to set unsafe header "User-Agent",解决方式可以为下载connection.js注释掉关于User-Agent的处理,然后上传到static resources中,在VF page引入static resource而不是系统的connection.js即可
总结:此种类似需求其实可以很多种方式实现,此处只是使用两种方式实现。第一种方式简单粗暴,而且兼容性好,第二种方式只是起到抛砖引玉的效果,关于ajax toolkit什么时候使用以及限制等请自行查看上方PDF。
salesforce 零基础学习(六十四)页面初始化时实现DML操作的更多相关文章
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce零基础学习(九十四)classic下pagelayout引入的vf page弹出内容更新此page layout
我们在classic环境中,有时针对page layout不能实现的地方,可以引入 一个vf page去增强标准的 page layout 功能,有时可能要求这个 vf page的部分修改需要更新此 ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce零基础学习(九十六)Platform Event浅谈
本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...
随机推荐
- 约瑟夫环(java面向对象实现)
/* * 作者:zhaop * 功能:约瑟夫环 * */ public class Joseph { public static void main(String[] args) { // TODO ...
- tomcat 优化配置 java-8 tomcat-7
tomcat 优化配置 , 说明 一.并发优化 1.JVM调优 以下为1G物理内存tomcat配置: JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256 ...
- Spring MVC 关于分页的简单实现
据本人了解,目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数 ...
- 苹果应用商店AppStore审核中文指南 分类: ios相关 app相关 2015-07-27 15:33 84人阅读 评论(0) 收藏
目录 1. 条款与条件 2. 功能 3. 元数据.评级与排名 4. 位置 5. 推送通知 6. 游戏中心 7. 广告 8. 商标与商业外观 9. 媒体内容 10. 用户界面 11. 购买与货币 12. ...
- Android学习笔记--处理UI事件
Handling UI Events 在Android里, 有不只一种方式可以截获用户与你的应用程序交互的事件. 在你的界面上处理事件时,你需要捕获用户与某个View实例交互时所产生的事件.View类 ...
- IOS开发-ObjC-NSArray
OC中数组分不可变数组(NSArray)和可变数组(NSMutableArray). 不可变数组: //------------------------------不可变数组------------- ...
- Poi之Word文档结构介绍
1.poi之word文档结构介绍之正文段落 一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元 获取所有段落:List<XWPFParagraph ...
- freemarker配置,使用
最近在项目中用到freemarker,总是报一些莫名其妙的错误. 调查得知是由于在配置文件中属性[tag_syntax]的设置问题,我们的环境下该属性(auto_detect)默认设置了自动检测,也就 ...
- 《R包的分类介绍》
R分析空间数据(Spatial Data) R机器学习包(Machine Learning) R多元统计包(Multivariate Statistics) R药物(代谢)动力学数据分析包 R计算计量 ...
- 全面解析Bootstrap图片轮播效果
http://www.jb51.net/article/75806.htm 一 . 结构分析 一个轮播图片主要包括三个部分: ☑ 轮播的图片 ☑ 轮播图片的计数器 ☑ 轮播图片的控制器 第一步:设计轮 ...