现在的位置: 首页 > 综合 > 正文

关于SharePoint2010 CQWP 项目样式使用小结

2014年02月24日 ⁄ 综合 ⁄ 共 6934字 ⁄ 字号 评论关闭

摘要:在SharePoint2010 OA建设中,所有部门(子网站)的“通知公告”及“文件汇编”均可以通过内容查询Web部件(CQWP)进行统一的查询和显示。但首页中的显示,无法根据项目创建的时间显示最新图标(update-icon),所以新添加的项目不能给用户以直观的视觉显示。针对此问题在修改中对SharePoint2010的构建和使用进行学习和开发。

正文:

一、问题提出

提出建议:

针对SP内容查询web部件中的内容,希望可以对新添加(根据时间判断)的内容有一个明显的标示,使用户一目了然。修改后效果如图(当然针对样式有很多种方法,此只是其中一种)。关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

二、问题分析

对新添加的内容有明显的标示,从样式角度讲可以有很多种方法,例如可以对内容字体进行加粗,将内容变颜色或者增加特殊符号图片等。但归根究底都需要找到相对应的样式并对其进行修改。

三、解决过程

1、首页通知公告采用的是CQWPthe
Content Query Web Part
),对所有网站中内容类型为“自定义类型/通知公告”的项目进行查询和显示。在SPSSharePoint
Server
)中选择“编辑页面”,在CQWP右上角下拉菜单中选择“编辑Web部件”,在“样式”标签下可以通过选择不同的项目样式对部件中的样式进行更改。(此处的样式是否可以自定义?在哪里定义?)

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

2、经查阅,根据一篇名为《Displaying Links Lists’ URLs in a Content
Query Web Part (CQWP) in SharePoint2010①》的博文,在Style
Library/XSL Style Sheets找到可以添加修改新样式的ItemStyle.xsl文件。

3、XSL是指可扩展样式表语言 (EXtensible
Stylesheet Language)
,是一种用于以可读格式呈现 XML 数据的语言。打开ItemlStyle.xsl文件,代码如下图,可以看出其中包括很多<</font>xsl:template>模块,通过template模块的name可以看出每个模块即对应项目样式中的一个选项。例如:

<xsl:template name="ImageRight"
match="Row[@Style='ImageRight']" mode="itemstyle">

是项目样式下拉中的“图像在右”选项。

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

4、在帮助文档《如何:为内容查询 Web 部件自定义
XSL②》的协助下,针对其中每行代码进行解析。选出一个样式选项,整体代码如下:

1. <xsl:template name="tongzhihuizong" match="Row[@Style='tongzhihuizong']"

2. mode="itemstyle">

3. <xsl:variable name="SafeImageUrl">

4. <xsl:call-template name="OuterTemplate.GetSafeStaticUrl">

5. <xsl:with-param name="UrlColumnName"
select="'ImageUrl'"/>

6. </xsl:call-template>

7. </xsl:variable>

8. <xsl:variable name="SafeLinkUrl">

9. <xsl:call-template name="OuterTemplate.GetSafeLink">

10. <xsl:with-param name="UrlColumnName"
select="'LinkUrl'"/>

11. </xsl:call-template>

12. </xsl:variable>

13. <xsl:variable name="DisplayTitle">

14. <xsl:call-template name="OuterTemplate.GetTitle">

15. <xsl:with-param name="Title"
select="@Title"/>

16. <xsl:with-param name="UrlColumnName"
select="'LinkUrl'"/>

17. </xsl:call-template>

18. </xsl:variable>

19. <xsl:variable name="LinkTarget">

20. <xsl:if test="@OpenInNewWindow = 'True'"
>_blank</xsl:if>

21. </xsl:variable>

22. <div id="linkitem" class="item">

23. <xsl:if test="string-length($SafeImageUrl)
!= 0">

24. <div class="image-area-left">

25. <a href="{$SafeLinkUrl}"
target="{$LinkTarget}">

26. <img class="image-fixed-width"
src="{$SafeImageUrl}"

27. alt="{@ImageUrlAltText}" />

28. </a>

29. </div>

30. </xsl:if>

31. <div class="link-item">

32. <div class="description">

33. <table width="98%">

34. <tr>

35. <td width="4px"><img
src="/SiteCollectionImages/tongzhisquare.gif"/></td>

36. <td width="83%">

37. <a href="{$SafeLinkUrl}"
target="_blank" title="{@LinkToolTip}">

38. <xsl:value-of
select="concat(substring(@Title,1,40),'...')"/>

39. </a>

40. </td>

41. <td><xsl:value-of select="substring(@Modified,1,10)"
/></td>

42. </tr>

43. </table>

44. </div>

45. </div>

46. </div>

47. </xsl:template>

1行和第47定义了整个模型的名称、位置及类型。

3行到第7行定义了一个名为SafeImageUrl的变量,通过将名为UrlColumnName值为ImageUrl的参数传入给名为OuterTemplate.GetSafeStaticUrl的模型,用来检测ImageUrl是否为安全的URL,并将返回值赋予SafeImageUrl变量。

8行到第12行定义了一个名为SafeLinkUrl的变量,通过将名为UrlColumnName值为LinkUrl的参数传入给名为OuterTemplate.GetSafeLink的模型,用来返回可安全显示给项目的URL,并将返回值赋予SafeLinkUrl变量。

13行到第18行定义了一个名为DisplayTitle的变量,通过将名为Title值为@Title和名为UrlColumnName值为LinkUrl的两个参数同时传入给名为OuterTemplate.GetTitle的模型,用来返回标题,并将返回值赋予DisplayTitle变量。

19行到第21行定义了一个名为LinkTarget的变量,通过判断@OpenInNewWindow内容为真成立,则给LinkTarget赋值_blank

(@Title@OpenInNewWindow是在哪里预定义的什么变量?

22行到第46行开始编写

,用来控制在CQWP中显示的内容。

23行到第30行用编写一个条件,如果SafeImageUrl变量不为空,则写入有链接的图片。

第37行到第39行写入了一个带有SafeLinkUrl链接值为@Title的标题,从第1个字节开始长度为40,并在标题后面加…

第41行写入值为@Modified的发文时间,从第1个字节开始长度为10,即只显示到天。

5、解析代码后发现,可以在ItemStyle.xsl文件的中添加div+css代码来修改表面的CQWP的样式。于是进行试验在第39行末尾添加如下代码:

<img src="/_layouts/2052/images/new.gif"
alt="New Post" />

经测试后,可以正常显示如下图:

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

6、接下来需要对判断项目是否为新的,根据博文《How to attach the “NEW!” icon
on a custom field③》、《SharePoint !NEW Item Icon④》和《Possible
to create an 'Updated!' icon similar to the
'New!' icon for CQWPs?⑤》可以往ItemStyle.xsl文件中添加如下代码进行判断项目是否为最新:

<xsl:if test="ddwrt:IfNew(string(@Created))"><!--the
Output Code if it’s true--><xsl:if>

于是试验在第39行末尾添加如下代码:

<xsl:if test="ddwrt:IfNew(string(@Created))">

<img src="/_layouts/2052/images/new.gif"
alt="New Post" />

<xsl:if>

7、但是添加以上代码后页面上显示如下错误信息:

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

8、于是查询ddwrt:IfNew()函数的用法,根据《SharePoint2010
Item Styles and DDWRT⑥》文章中所写,需要在.xsl文件开头声明ddwrt命名空间,然后再在代码中引用,而具体的ddwrt命名空间的内容详见《SharePoint
Data View Web Part Extension Functions in
the ddwrt Namespace⑦》(支持Microsoft Windows SharePoint Services
2003,是指从2003版就可以使用这个命名空间么?还是说2010版有替代方式?

9、如是在ItemStyle.xsl文件开头中添加代码如下:

xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"

10、保存后页面显示正常,如下图。至此最初问题解决完毕。

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

四、问题扩展

1、有关Stsadm.exe的初步了解

根据博文《SharePoint !NEW Item Icon④》,ddwrt:IfNew()函数会将”2
days”添加的项目默认为新添加,并且可以通过STSADM”2
days”这个属性进行修改。查阅后根据《Stsadm 命令行工具 (Windows
SharePoint Services)
⑧》可知Stsadm是安装在本地计算机上的一个exe程序,可以通过命令行(cmd)调用Stsadm.exe修改参数,但需要操作者在服务器本地以管理员的方式进行操作方可。

2、有关SPSxsl调用xml的初步了解

在上述代码中出现有以@开头的变量,例如@Title@OpenInNewWindow@Created,这些变量在何处定义,为什么使用时前段要添加@?根据《W3School
XPath语法⑨》可知,在XSL文件中@表示选取节点的属性,那具体选取的节点是什么?又是从哪个XML文件中选取的节点?

根据《How to dump the raw XML from a Content
Query Web Part⑩》文章提供的方法,通过修改XSL
Style Sheets/
ContentQueryMain.xsl文件中的两行代码:(在替换之前一定要将原文件COPY一份,获取XML后再将原文件替换回来

<xsl:output method="html" indent="no"
/>

替换成

<xsl:output method="xml" indent="yes"
/>

<xsl:template match="/">

<xsl:call-template name="OuterTemplate"
/>

</xsl:template>

替换成

<xsl:template match="/">

<xmp><xsl:copy-of select="*"
/></xmp>

</xsl:template>

保存后在页面CQWP的位置将会显示XML的内容。(原文献中要求SAVE
and IISReset
,由于用SPD2010进行修改,故未进行IISReset也可实现

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

将其复制下来存成csCQWP.xml文件。

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

对导出的XML for CQWP进行解读,发现其实很简单。如图所示我的列表中一共只有两项,一项是116日建立的“1231234123”,一项是68日建立的“测试”。

关于SharePoint2010 <wbr>CQWP <wbr>项目样式使用小结

csCQWP.xml内容抽象出来格式如下:

<dsQueryResponse>

<Rows>

<Row Title=”1231234123” <!--a variety of attributes-->
/>

<Row Title=”测试” <!--a variety of attributes-->
/>

</Rows>

</dsQueryResponse>

据此解释ItemStyle.xsl中的@Title即“1231234123”、“测试”,@Created即“2013-11-06
09:15:20
”、“2013-06-08
13:51:39
”,但是并没有找到@OpenInNewWindow属性(难道是被隐藏了?)。

3ddwrt命名空间也可以作为深入探究,在此不再进行展开。

五、过程小结:

众所周知,SPS是微软公司研发,提供企业级功能来满足关键业务需求,面向企业级用户,方便管理内容和业务流程、简化人员跨部门查找和共享信息的方式,协助企业做出合理决策⑧。通过SPD(SharePoint
Designer)对其内部数据进行存储和修改,可以发现SPS虽然可以很简单的通过前端操作直接搭建功能性网站,但如果需要对其细节样式进行修改,或是添加特殊功能,有时候需要程序员深入网站内部修改代码。其中包括ASPc#HTMLcssXMLXSL等很多。在工作中探索学习,并将学习的东西转化为自身能力从而更好的完成工作是根本目的。而对于接触SPS不久的我,解决这个问题花掉了二天的时间查阅资料和书籍。

整个过程是纠结的,总结出以下几点网络搜索注意事项:

1、虽然目前网络资源丰富搜索引擎强大,但是很多技术员的分享均是建立在完全了解架构的基础上,所以不能从源头给出解释,需要查阅大量的基础概念书籍,增加自身的基础技术知识。

2、另外在搜索相关技术知识的时候,不能只认定一个搜索引擎,百度谷歌都可利用,其中会有很多不同的资源和文章。

3、先进的技术往往没有国内的技术员给予翻译,需要利用英文进行多方查询。

(供所有SharePoint工作者和爱好者参考,技术交流)

附录:参考文献

⑴《Displaying
Links Lists

URLs in a Content Query
Web Part (CQWP) in SharePoint2010

⑵《如何:为内容查询
Web 部件自定义
XSL

⑶《How
to attach the
NEW!
icon on a custom field

⑷《SharePoint
!NEW Item Icon

⑸《Possible
to create an 'Updated!' icon similar to the
'New!' icon for CQWPs?

⑹《SharePoint2010
Item Styles and DDWRT

⑺《SharePoint
Data View Web Part Extension Functions in
the ddwrt Namespace

⑻《Stsadm
命令行工具 (Windows
SharePoint Services)

⑼《W3School
XPath语法

⑽《How
to dump the raw XML from a Content Query
Web Part

⑾《SharePoint
Server 2010_百度百科

⑿《W3School
XSL语言

⒀《Google
Search:
sharepoint xsl new-icon

⒁《TAG
ARCHIVES: SHAREPOINT

⒂《Using
XML and XSL in SharePoint

⒃《Configuring
and Customizing the Content Query Web Part

⒄《In
content query 'new icon' when new item added--sharepoint

⒅《Display
"! Updated Today" indicator just like "!
New" icon in Document Library

⒆《SharePoint 2007 入门经典》(美)Amanda
Murphy/ Shane Perran

崔洪斌
/薛焱

 

原文地址:

http://blog.sina.com.cn/s/blog_be039fde0101ejdg.html

抱歉!评论已关闭.