设为首页 收藏本站
查看: 1044|回复: 0

[经验分享] SharePoint:扩展DVWP

[复制链接]

尚未签到

发表于 2015-9-29 09:31:39 | 显示全部楼层 |阅读模式
  回顾在本系列第14部分中,我们提到“如何将PreSaveAction()与jQuery配合使用”。PreSaveAction()允许我们在保存记录前做一些事情,当时我快速的列了一些在现实场景中可能会用jQuery做的事。我们举了一个审计跟踪的例子。当主列表发生变更时,向另一个列表中写入主列表的变更信息。最终实现的效果是我们有两块体现真实信息的地方:(1)当前视图(2)一个关于变更的历史记录,展示达到当前视图所经历的过程。
  在本文中,我打算花一点时间剥开一层洋葱皮,看一下具体如何实现当列表项被创建,修改或删除时在另一个列表中写记录。

在列表B中创建一条来源与列表A的记录
  有太多的项目中需要我们在列表中插入,编辑,或删除列表项,没准你现在进行的项目中就有类似的需求吧。或许你以前做过订单处理解决方案,其中订单产生后我们需要更新库存信息。又或许是一个图书借阅系统,当有人借出一本书时你需要更新该书的状态。
  要给另一个列表更新信息我们有很多选择。但如果你是要创建一个条全新的列表项,就像审计跟踪例子中需要的那样,要面临哪些挑战呢?显然,你必要决定什么数据需要抓取到审计跟踪记录里。在主列表中的每一个需要记录变更的栏,都必须在审计列表中存在对应的栏。
  从本例的设计初衷出发,我们会选取主列表中几乎所有的栏记录其变更,进行审计。
DSC0000.png
  主列表——FTE(全日制雇员,Full-time Employees)
DSC0001.png
  FTE的审计跟踪列表
  其中的名称和顺序没必要完全吻合。对于本例来说,栏的对应关系如下:



主列表(显示名称| 内部名称)



审计列表(显示名称| 内部名称)



Location | @LocDept



Location | @Location



Group | @Group12



Group | @Group



Position | @Positions



Position | @Position



Worker | @Title



Employee | @Title



Work Shift | @Workshift



Work Shift | @WorkShift



FTE | @FTE



FTE |@FTE



EffDate | @EffDate



Effective Date | @EffDate



Old Location | @Old%5Fx0020%5FLocation


  


Last Change | @Audit


  

  


Change Type | @ChangeType


  


Month | @Month


  


Year | @Year


  


From/To | @FromTo



  创建者(Created By)修改者(Modified By) 会由 SharePoint 自动填写,所以在两个列表中我们都不考虑这两个字段。
  注意:两个列表的定义有以下几点不同:


  • 在主列表中有一些查阅项类型的栏,对应到审计跟踪列表时变成了单行文本。
  • 我在主列表中添加了一个Last Change栏。我们将用于保存最新一条审计记录的ID,并显示其修改时间字段。这里与Effective Date不同。
  • 在审计列表中,我添加了:

    • Change Type:一个选项型的栏(New,Update,Terminate,Resign,Transfer)——当一条列表项被插入,该值为New;对于编辑,如果Location发生了修改,则该值为Transfer;任何其他的修改都设为Update。如果列表项被删除,我们将记录是有公司解雇的(Terminate)还是有雇员提出辞职的(Resign)。【标注:在这里做一个记号,将来当我们讨论创建一个备用编辑模版时还会提及】
    • From/To:选项型的栏(From,To)——用于显示记录变更前/后的视图,即一次修改会创建两条记录。
    • Month:计算栏,用来取出Effective Date的月份,方便进行排序/分组。[公式: =TEXT([Effective Date],"mm – mmmm")]
    • Year:计算栏,用来取出Effective Date的年,方便排序。 [公式:=TEXT([Effective Date],"yyyy")]


DSC0002.png
  FTE 变更审计

回到jQuery部分的工作
  这里的jQuery脚本也是来自与第14部分(有关变量的创建,请参考第13部分),其中用到了Marc Anderson的SPServices库:



  function PreSaveAction() {
var txtChangeType = "Update";
var txtNewName = $("input[name*=$ff1_]").val();
var txtOldName = $("span[id*=_ff9_]").text();
var txtNewPos = $("input[name*=$ff3_]").val();
var txtOldPos = $("span[id*=_ff11_]").text();
var txtNewShift = $("select[name*=$ff4_]").val();
var txtOldShift = $("span[id*=_ff12_]").text();
var txtNewFTE = $("input[name*=$ff5_]").val();
var txtOldFTE = $("span[id*=_ff13_]").text();
var txtNewGrp = $("input[name*=$ff2_]").val();
var txtOldGrp = $("span[id*=_ff10_]").text();
var txtNewLoc = $("input[name*=$ff6_]").val();
var txtOldLoc = $("span[id*=_ff14_]").text();
var txtEffDate = $("input[name*=$ff7_]").val();
if (txtNewLoc != txtOldLoc) txtChangeType = "Transfer";
$().SPServices({
operation: "UpdateListItems",
async: false,
listName: "FTE Change Audit",
updates: "<Batch OnError='Continue' PreCalc='TRUE'>" +
"<Method ID='1' Cmd='New'>" +
"<Field Name='FromTo'>From</Field>" +
"<Field Name='Title'>" + txtOldName + "</Field>" +
"<Field Name='Location'>" + txtOldLoc + "</Field>" +
"<Field Name='Group'>" + txtOldGrp + "</Field>" +
"<Field Name='Position'>" + txtOldPos + "</Field>" +
"<Field Name='WorkShift'>" + txtOldShift + "</Field>" +
"<Field Name='FTE'>" + txtOldFTE + "</Field>" +
"<Field Name='EffDate'>" + txtEffDate + "</Field>" +
"<Field Name='ChangeType'>" + txtChangeType + "</Field>" +
"</Method>" +
"</Batch>",
completefunc: function(xData, Status) {
}
});
$().SPServices({
operation: "UpdateListItems",
async: false,
listName: "FTE Change Audit",
updates: "<Batch OnError='Continue' PreCalc='TRUE'>" +
"<Method ID='1' Cmd='New'>" +
"<Field Name='FromTo'>To</Field>" +
"<Field Name='Title'>" + txtNewName + "</Field>" +
"<Field Name='Location'>" + txtNewLoc + "</Field>" +
"<Field Name='Group'>" + txtNewGrp + "</Field>" +
"<Field Name='Position'>" + txtNewPos + "</Field>" +
"<Field Name='WorkShift'>" + txtNewShift + "</Field>" +
"<Field Name='FTE'>" + txtNewFTE + "</Field>" +
"<Field Name='EffDate'>" + txtEffDate + "</Field>" +
"<Field Name='ChangeType'>" + txtChangeType + "</Field>" +
"</Method>" +
"</Batch>",
completefunc: function(xData, Status) {
}
});
return true;
};
</script>
拆开来看
  假设表单操作按钮已经被我们改为调用PreSaveAction(),那么这段脚本就会把变更保存至到审计列表。下面是整个过程的慢动作回放:

修改类型



var txtChangeType = "Update";

  大多数的变更为Update类型。但是当Location发生修改时,类型就变成了Transfer(不考虑其他栏是否发生了修改...你的场景可能于此不同)。在我们设置所有的变量前,应对该项进行检查。



    var txtNewLoc = $("input[name*=$ff6_]").val();
var txtOldLoc = $("span[id*=_ff14_]").text();
. . .
if (txtNewLoc != txtOldLoc) txtChangeType = "Transfer";
Effective Date
  由于Effective Date的变更只涉及到本身,所以这种情况下From和To两个变更版本是相同的。

SPServices
  现在,我们得到了变更前的“旧”值和变更后的“新”值,接下来直接通过SPServices调用UpdateListItems创建两条记录就可以了。在上面的29行到41行,我们告诉函数创建一条新记录。然后,我们只需加载上CAML把值填入审计列表的相应的栏即可。
  或者,我们可以用下面的语法替换updates中使用的CAML:



        batchCmd: "New",
valuepairs: [["FromTo", "From"],
["Title", txtOldName],
["Location", txtOldLoc],
["Group", txtOldGrp],
["Position", txtOldPos],
["WorkShift", txtOldShift],
["FTE", txtOldFTE],
["EffDate", txtEffDate],
["ChangeType", txtChangeType]],

  注意到其中listName是目标列表的显示名称:



        listName: "FTE Change Audit",

  接下来对应FromTo="To"再重复一遍上面的过程。我们就完成了两条审计跟踪记录的创建。

插入和删除
  你可以在新建时使用相同的技术,但如果用工作流来处理“新建项目时”会更容易些。如果你需要我对这两种方式进行详细讲解的话请发表评论。
  
  我们会在将来讲到添加一个备用编辑模版时使用Resign和Terminate变更类型。
  
  下一次:如果你需要在DVWP中从一个关联的列表更新数据该怎么办?在接下来的扩展DVWP系列中,我们会公布谜底。
  
  参考资料
  SharePoint:Extending the DVWP - Part 25:Using an Audit Trail by Creating List Items with SPServices

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120285-1-1.html 上篇帖子: WSS3SDK之:如何从本地文件夹上传文件到SharePoint站点 下篇帖子: SharePoint 2013 跨网站集发布功能简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表