元数据在Sharepoint中是一个很常用的功能,他提供一个方法来管理企业中常用的关键词,可以更加统一的使用和更新。默认情况下,绑定在列表或库中的元数据字段可以设置是否允许为多个值。但是无法控制在弹出选择元数据窗口上的术语集是否为多选值。所以想了个办法来解决 

  

  这里是重写系统脚本_layouts/15/scriptforwebtaggingui.js 第312行,这个函数是用来设置Dialog到top window里面。我们到里面加一个函数initCustomPickerDialog

  

Microsoft.SharePoint.Taxonomy.ControlObject.set_termPickerDialog = function Microsoft_SharePoint_Taxonomy_ControlObject$set_termPickerDialog(value) {ULSX8o:;
window.top.termPickerDialog = value;
if(value!=null)
initCustomPickerDialog();
return value;
}
function initCustomPickerDialog(){

	if(typeof window.top.termPickerDialog.$0_0.contentWindow.Microsoft == "undefined")
{
setTimeout(initCustomPickerDialog,500);
return;
} window.top.termPickerDialog.$0_0.contentWindow.Microsoft.SharePoint.Taxonomy.WebTaggingDialog.addToFieldControl
= function Microsoft_SharePoint_Taxonomy_WebTaggingDialog$addToFieldControl ()
{ULSXWv:;
//alert('come');
var cnode = window.top.termPickerDialog.$0_0.contentWindow.Microsoft.SharePoint.Taxonomy.WebTaggingDialog.$1.get_focusNode();
var currentNodeInfo={ name: cnode.$1B_2 , id: cnode._element.id};
var parentNodeInfo= { name: cnode.$1Z_2._element.parentNode.control.$1B_2, id:cnode.$1Z_2._element.parentNode.id}

          //alert(JSON.stringify(currentNodeInfo));
//alert(JSON.stringify(parentNodeInfo));
          //TODO you job ...
if(currentNodeInfo.name.startsWith("全"))
            return false;
window.top.termPickerDialog.$0_0.contentWindow.Microsoft.SharePoint.Taxonomy.WebTaggingDialog.addTermToField(cnode);
} }

  

然后注入代码到弹出窗口中。重写_layouts/15/webtaggingdialog.js  188行,

Microsoft.SharePoint.Taxonomy.WebTaggingDialog.addToFieldControl

这个函数是选择术语到框里面的事件。在这个函数中加入我们自定义的代码,就可以控制是否允许选择与否此术语。

上面的代码是控制弹出窗口里面的事件,但是如果直接在输入框里面输入呢?可以用下面的脚本来处理

//设置值,webTaggingId 是元数据框的id
function setTaxonomyControlObjectValue(webTaggingId, termValue) {
var webTaggingCtl = $get(webTaggingId);
var taxCtlObj = new Microsoft.SharePoint.Taxonomy.ControlObject(webTaggingCtl);
taxCtlObj.enableControl(true);
taxCtlObj.setRawText(termValue);
taxCtlObj.retrieveTerms();
} function getTaxonomyControlObjectValue(webTaggingId) {
var webTaggingCtl = $get(webTaggingId);
var taxCtlObj = new Microsoft.SharePoint.Taxonomy.ControlObject(webTaggingCtl);
var termValue = taxCtlObj.getRawText();
return termValue;
}

肯定会觉得webTaggingId不知道从哪来的。使用调试工具,一般结构都是这样的。找到这个id即可

然后我们获取到了这个id,就可以获取到选择的值。或者我们直接在页面上重写系统函数。

/_layouts/15/scriptforwebtaggingui.js 2893行:get_suggestValue 
Microsoft.SharePoint.Taxonomy.Suggestion.prototype.get_suggestValue=function(){
var selectedSuggestValue=this.$4_2.suggestValue;
//format : 手机|70517c38-0977-4ba0-942c-999e5df42ab2
//我们在经过业务验证后如果是不允许的值,直接返回
//不允许|00000000-0000-0000-0000-000000000000 就可以显示一段错误信息
// alert(this.$4_2.suggestValue);
return this.$4_2.suggestValue;
}
//这个函数也可以用来处理
Microsoft.SharePoint.Taxonomy.ControlObject.prototype.$23_2 = function ($p0) {
var $v_0 = '';
this.$1i_2(false);
console.log('in');
var customValidation = function(term){ //这个是我自己加的验证函数
debugger;
var termName = term.$5_0;
var termID = term.$7_0; return termName.startsWith("个人");
}
debugger;
if ($p0) {
var $v_1 = false;
var selectedTerms = Microsoft.SharePoint.Taxonomy.Term.getTerms($p0);
for (var i = 0; i < selectedTerms.length; i++) {
var term = selectedTerms[i]; if (i > 0) {
$v_0 += ';' + Microsoft.SharePoint.Taxonomy.ControlObject.$f;
}
if ((term.get_isValid() && (this.getIsMulti() || !i)) && customValidation(term)) {
$v_0 += this.$C_2('valid-text', '') + Microsoft.SharePoint.Taxonomy.ControlObject.$A(selectedTerms[i].$5_0) + this.$J_2();
$v_1 = true;
}
else {//这一块就是处理标记成错误数据的
if (!this.getIsMulti() && i > 0) {
$v_0 += this.$C_2('invalid-text', Microsoft.SharePoint.Taxonomy.ScriptResources.webTaggingUI_Tooltip_multi_in_single);
}
else {
$v_0 += this.$C_2('invalid-text', Microsoft.SharePoint.Taxonomy.ScriptResources.webTaggingUI_Tooltip_invalid);
}
$v_0 += Microsoft.SharePoint.Taxonomy.ControlObject.$A(selectedTerms[i].$5_0) + this.$J_2();
if (selectedTerms[i].get_isUnvalidated()) {
this.$1i_2(true);
}
$v_1 = false;
}
}
if (this.getIsMulti() && $v_1) {
$v_0 += ';' + Microsoft.SharePoint.Taxonomy.ControlObject.$f;
}
}
return $v_0;
}

自定义SharePoint 2013 元数据选择控件的更多相关文章

  1. Android 自定义支持快速搜索筛选的选择控件(一)

    Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...

  2. Android自定义View(RollWeekView-炫酷的星期日期选择控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义Cus ...

  3. 【C#】wpf自定义calendar日期选择控件的样式

    原文:[C#]wpf自定义calendar日期选择控件的样式 首先上图看下样式 原理 总览 ItemsControl内容的生成 实现 界面的实现 后台ViewModel的实现 首先上图,看下样式 原理 ...

  4. 在 SharePoint 2013 中选择正确的 API 集

    决定使用哪个 API 集的因素   您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台.您使用哪一个 API 集取决于以下因素: 应用程序的类型. 可能的类型包括但不限于以 ...

  5. SNF开发平台WinForm之三-开发-单表选择控件创建-SNF快速开发平台3.3-Spring.Net.Framework

    3.1运行效果: 3.2开发实现: 3.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...

  6. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

  7. 使用sui实现的选择控件【性别、日期、省市级联】

    使用sui mobile做的选择控件,其中sm.js有修改,增加自定义api,详情请看index.html的注释,不多说了,上代码 <!DOCTYPE html> <html> ...

  8. 通用数据水平层级选择控件v0.70升级版使其支持jQuery v1.9.1

    升级原因:作者原来脚本支持的jquery版本太低了,查找了下资料,使得它能支持最新版本的jquery 备注说明:脚本代码源作者跟源文出处很难找,只能在此特感谢他的分享. 更新部分: 1.新版本不再支持 ...

  9. C# 中带有中国农历的日期选择控件

    开源一款自己刚开始接触 C# 时开发的带有农历信息的日期选择控件,记得那时还是在2010年的寒假期间做的这个东西.刚开始接触 C# 时,使用WinForm来开发桌面程序,觉得简直是简单又迅速,由于 C ...

随机推荐

  1. c++类的 static 和const那些事

    1.static成员变量(非const)必须在类外定义,在类中只是作为声明(声明其scope为该类),不能使用类初始化成员列表来初始化,只能在定义的时候初始化. 2.static const的成员变量 ...

  2. `cocos2dx非完整`开篇

    相信每个人都有一些自己的项目开发习惯,在·开篇·中我主要是会提到一些项目的配置问题.无论做一款什么样的手游项目,我们总是会从需求的角度出发去选择开发引擎,开发工具等一些列的工具去完善我们的开发环境.当 ...

  3. JavaScript 中介者模式与观察者模式有何不同?

    http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp 感觉二者非常像,都是pub/sub机制,如何进行区分 ...

  4. 编辑器之神VIM 总结(一) 基础部分

     版本号 说明 作者 日期  1.0  vim基础知识 Sky Wang 2013/06/19       概要 vim和emacs,一个是编辑器之神,一个是神一样的编辑器.他们被称是UNIX系统下的 ...

  5. [git]查看某一行代码是谁写的

    git blame filename,'blame'意思为责怪!哈哈哈. 就会列出来每行的修改纪录.你可以通过行数或者代码来查看,是谁的锅!

  6. [linux]scp指令

    实例1:从远处复制文件到本地目录 $scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/ 说明: 从10.6.159.147机器上的/opt/soft ...

  7. Android View 之进度条+拖动条+星级评论条....

    PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条...       进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此 ...

  8. HTML简明教程(二)

    HTML简明教程(二) 一.HTML 图像 二.HTML 表格 三.HTML 列表 四.HTML div和 span 五.HTML 布局 六.HTML 表单和输入 七.HTML 框架 八.HTML内联 ...

  9. 【HTML5】Canvas 实现放大镜效果

    图片放大镜 效果 在线演示    源码 原理 首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致, 如下图所示: 初始化 <canvas id=&qu ...

  10. sublime 插件zen coding

    sublime的插件Zen Coding是一个编写html的神器,现在已经更名为Emmet了. 在sublime中的package需要搜索的是Emmet 相关网站: 官网 Zen Coding: 一种 ...