1、显示模板介绍
SharePoint Server 2013中的显示模板用于Web部件中,使用搜索技术(本文中指搜索 Web 部件,只有搜索 Web 部件可以使用显示模板。内容查询 Web 部件不是搜索驱动部件,因此不使用显示模板。)显示对搜索索引的查询结果。显示模板控制显示在搜索结果中的托管属性,以及在 Web 部件中显示的方式。每个显示模板都由两个文件组成:一个是可以在 HTML 编辑器中进行编辑的 HTML 版显示模板,另一个是 SharePoint 使用的 .js 文件(对 HTML 显示模板所做的更改将同步到关联的 .js 文件。与母版页和页面布局不同,在使用显示模板时,您无法通过破坏文件之间的关联选择仅使用 .js 文件。必须在 HTML 文件中输入所有 HTML 和 JavaScript。)
2、显示模板和Web部件的关系
显示模板有两种主要类型:
控件模板 决定结果显示方式的整体架构。包括列表、分页列表和幻灯片放映。
项模板 决定集中的每个结果的显示方式。包括图像、文本、视频以及其他项目。
控件显示模板提供了 HTML,以构建希望的搜索结果显示方式的整体布局。例如,控件显示模板可能会提供列表标头及开头和结尾的 HTML。控件显示模板仅在 Web 部件中呈现一次。
项显示模板提供的 HTML 决定每个项目在结果集中的显示方式。例如,项显示模板可能会提供列表项的 HTML,其中包含的图片和三行文本映射到与项目关联的不同托管属性。每个项目的项显示模板在结果集中呈现一次。因此,如果结果集包含十个项目,则项显示模板会创建 HTML 部分十次。
3、显示模板结构
用于显示模板的 HTML 文件是全形 HTML 文档,但不显示完整的 HTML 网页。SharePoint 将显示模板 HTML 文件片段转换为 JavaScript。本节将说明显示模板的四个主要部分。
搜索 Web 部件处于编辑模式时,显示模板文件的 <title> 标记中的文本用作 Web 部件编辑窗格"显示模板"部分的显示名称。以下示例是名称为"Item_Picture3Lines.html" 的项显示模板:
<title>Picture on left, 3 lines on right</title>
紧接着 <title> 标记的是以下标记绑定的自定义元素集:
<!--[if gte mso 9]><xml> <mso:CustomDocumentProperties> … </mso:CustomDocumentProperties> </xml><![endif]-->
这些元素及其属性为 SharePoint 环境提供了有关显示模板的重要信息。表 1 说明了用于显示模板的自定义属性。
表 1. CustomDocumentProperties 条目列表
属性 |
说明 |
---|---|
TemplateHidden |
指示是否在 Web 部件的可用模板列表中隐藏显示模板的布尔值。此值可在显示模板文件属性中进行更改。 |
ManagedPropertyMapping |
将搜索结果项目公开的字段映射到 JavaScript 可用的属性中。仅用于项目模板中。 |
MasterPageDescription |
提供显示模板简单易懂的描述。此属性在 SharePoint 编辑环境中显示。此值可在显示模板文件属性中进行更改。 |
ContentTypeId |
与显示模板关联的内容类型的 ID。 |
TargetControlType |
指示显示模板所使用的上下文。此值可在显示模板文件属性中进行更改。 |
HtmlDesignAssociated |
指示显示模板 HTML 文件是否具有与其相关联的 .js 文件的布尔值。 |
HtmlDesignConversionSucceeded |
指示转换过程是否成功。此值由 SharePoint 自动添加到文件中,且仅用于自定义显示模板中。 |
HtmlDesignStatusAndPreview |
包含 HTML 文件的 URL 和状态列("转换成功"或"警告和错误")的文本。此值由 SharePoint 自动添加到文件,且仅用于自定义显示模板中。 |
在 <body> 标记内,可以看到以下 <script> 标记:
<script> $includeLanguageScript(this.url, "~sitecollection/_catalogs/masterpage/Display Templates/Language Files/{Locale}/CustomStrings.js"); </script>
默认情况下,此行包括在所有显示模板中。可以将 <script> 标记中的更多代码行添加到引用 CSS 文件或主显示模板 HTML 文件外部的其他 JavaScript 文件。表 2 显示了如何包括其他资源的示例。
表 2. 在 <script> 标记中包括外部资源的示例
如果您想要包括以下外部资源: |
使用以下代码: |
---|---|
作为当前网站集的一部分的 JavaScript 文件 |
$includeScript(this.url, "~sitecollection/_catalogs/masterpage/Display Templates/Content Web Parts/MyScripts.js"); |
外部 JavaScript 文件 |
$includeScript(this.url, "http://www.contoso.com/ExternalScript.js"); |
作为当前网站集的一部分的 CSS 文件 |
$includeCSS(this.url, "~sitecollection/_catalogs/masterpage/Display Templates/Content Web Parts/MyCSS.css"); |
与当前显示模板相对的位置中的 CSS 文件 |
$includeCSS(this.url,"../../MyStyles/MyCSS.css"); |
<script> 标记后是具有 ID 的 <div> 标记。默认情况下,此 <div> 标记的 ID 与 HTML 文件的名称匹配。您希望显示模板提供的任何 HTML 或代码必须包括在此 <div> 标记内。但标记本身不包括在运行时呈现于网页上的标记内。
注释 |
---|
如果您希望为运行时呈现于页面上的 HTML 块分配 CSS 样式或 ID,可以添加一个新的标记到第一个 <div> 标记内。还可以为控件模板中包围变量 _#= ctx.RenderGroups(ctx) =#_ 的 HTML 分配 CSS 样式或 ID。变量 _#= ctx.RenderGroups(ctx) =#_ 用于呈现包围项目模板呈现的查询结果的 HTML。 |
您在第一个 <div> 标记中可以看到以 <!--#_ 开头、以 _#--> 结尾的注释块中的代码。可以使用这些块中的 JavaScript 代码,以及块之外的 HTML。还可以使用这些块控制带有条件语句的 HTML。为此,使用带有条件语句和左方括号的注释块,然后是 HTML,然后是另一个带有右方括号的注释块。以下示例中的定位标记仅在 linkURL 对象的值不为空时呈现在页面上。
<!--#_ if(!linkURL.isEmpty) { _#--> <a class="cbs-pictureImgLink" href="_#= linkURL =#_" title="_#= $htmlEncode(line1.defaultValueRenderer(line1)) =#_" id="_#= pictureLinkId =#_"><!--#_ } _#-->
映射输入属性并获取其值
项显示模板的标头部分具有一个名称为 ManagedPropertyMapping 的自定义文档属性。此属性采用搜索使用的托管属性,并将它们映射到可由显示模板使用的值。此属性是以逗号分隔的值的列表,使用以下格式:'属性显示名称'{属性名称}:'托管属性'。例如,'Picture URL'{Picture URL}:'PublishingImage;PictureURL;PictureThumbnailURL'。
我们来看看详细的格式:
属性显示名称是在选定显示模板后,显示于 Web 部件编辑窗格中的属性名称。
属性名称是使用本地化字符串资源查找托管属性的名称的标识符。也是显示在 Web 部件设置菜单"属性映射"部分的值。编辑 Web 部件的设置时,可以更改此值,以更改关联到 Web 部件中显示的字段的托管属性。
托管属性是一个或多个托管属性的字符串,用分号隔开。在运行时,对列表从左至右求值,与当前搜索项目的托管属性名称匹配的第一个值将映射到此槽。这让您可以对可以使用多个项目类型,以及可以在存在兼容属性时使用一致呈现的显示模板进行写入。
映射属性之后,可以通过使用以下代码获取脚本中的值:var pictureURL = $getItemValue(ctx, "Picture URL");
传递给 $getItemValue() 的第二个参数必须与用于 ManagedPropertyMapping 元素中单引号中的属性显示名称匹配。本示例中,Picture URL 是传递给 $getItemValue() 的属性名称。
此代码返回值信息对象 (valueInfoObj)。此对象包含输入值的原始表示形式,以及使用适用默认编码的值。
可以像往常那样使用 JavaScript 部分中的变量,对变量进行操作并创建 HTML 字符串以在运行时呈现在页面上。但是,若要引用 HTML 的脚本中直接声明的变量,必须使用以下格式:_#= variableName =#_。例如,若要使用变量 pictureURL 作为图像的值,请使用以下 HTML:<img src="_#= pictureURL =#_" />
通过显示模板使用 jQuery
可以通过显示模板使用 jQuery。但是请注意两个重要因素:
若要在显示模板中包括 jQuery 库,请按照本文之前所述的脚本块一节中的说明执行操作。
如果使用 jQuery 中的 ID 选择器,请使用以下代码创建 ID 的变量:var containerQueryId = '#' + '_#= containerId =#_';
使用以下代码引用 jQuery 中的选择器:$('_#= containerQueryId =#_')
原文链接:http://msdn.microsoft.com/library/jj945138.aspx