2013年4月25日,星期四

使用自定义显示模板配置Content Search Web部件

我最近遇到了一个有趣的问题,关于将Content Search Web部件配置到具有AllUsersWebPart元素的页面上。我应该先说’我(目前)没有提供很棒的服务“here’s some code”解决问题的方法,但会建议应该有效的方法。我主要是想在此阶段提高对问题的认识– if you hit it, you’re not going crazy.

本系列文章:

如果你’在SharePoint 2013中使用Content Search Web部件,您’您将知道可以提供自定义JavaScript模板(称为显示模板)来控制项目的显示方式。有效地你’重新指定输出的HTML。将文件放置在正确的位置后,您可以在‘Display Templates’“内容搜索” Web部件属性的“部分”,如下所示:

选择自定义显示模板

这些显示模板文件应该位于母版页库中,如果您在其中浏览,则可以看到SharePoint各个部分的所有开箱即用的显示模板(内容搜索Web部件,搜索悬停面板,优化面板)等等。)。那里’实际上,已激活发布功能的网站与未激活发布功能的网站之间存在很大差异。具体来说,如果您在发布网站上浏览,’会看到两组文件–HTML和JavaScript:

Content Search 显示模板 in publishing site

..但是如果您查看的是一个没有发布的网站,那么您只会看到JavaScript文件:

Content Search 显示模板 in non-publishing site

这是“Design Manager”发布站点中提供的支持–您将获得每个模板的HTML和JS文件,并且只需编辑HTML文件即可。当您执行此操作时,关联的JavaScript显示模板(将以您提供的HTML格式输出数据)是从HTML文件“生成”的。这是通过“母版页库”上的事件接收器发生的,并且发生的速度足够快,可以使迭代开发正常进行–作为一个相当顽固的开发人员,在SharePoint Designer中执行此操作对我来说很好。但是,另一种选择(由对HTML编辑的支持提供)是使用具有设计图面的HTML编辑器(Dreamweaver / Expression Web / Allaire 首页site(!)/任何)。– you can 将Windows资源管理器中的驱动器映射到母版页库,以便直接从编辑器保存到SharePoint开发环境。

功能中的供应-部署JavaScript和/或HTML文件?

因此,在处理实际问题之前,如果我们要针对一个网站发布内容,我们将有一个有趣的决策点"开发人员/ Visual Studio” way. Do we:

  • 在功能中配置HTML文件,然后“touch” the file somehow (e.g. custom event receiver) to ensure JavaScript文件gets generated?
  • Provision JavaScript文件only

在使用完这两个选项之后,我对此的强烈看法是,您仅应置备JavaScript文件。一定要在核心开发阶段使用HTML支持 获得的JavaScript file – but when you’准备将其带到其他环境中,将其打包在Visual Studio中,然后将其包含在服务器场/沙盒WSP中(注意:这都不真正适用于应用程序)。我之所以这样说是因为:

  • 您 are NOT going to need those HTML files in production –在运行时不使用它们。整个过程纯粹是为了支持设计阶段!
  • 如果你 need to go back and make changes, then you can either edit JavaScript文件directly (frankly no sweat for most devs) or fire up a publishing site somewhere, use the HTML support, and then drop it back into Visual Studio when done

触摸文件–>触发事件接收器–> to generate a file –>您已经在开发环境中拥有了==对我来说是没有道理的:)但是,我会说 如果您*正在*在发布站点中工作(例如在SPD中),请始终编辑HTML文件(如果存在) –否则,当然,只要该事件接收器执行,您对.js文件的更改将被覆盖。

我为此使用XML,如下所示–我发现关键属性‘HtmlDesignAssociated’默认为0(零),但仅部署.js文件时,我希望将其设置为零 明确地:

有了它,让’s讨论了我在扩展上述内容时遇到的问题-将内容搜索Web部件自动添加到具有AllUsersWebPart元素的页面。

问题-使用AllUsersWebPart设置Content Search Web部件时未链接自定义显示模板

[2013年4月30日更新–伊万·涅加诺夫(Ivan Neganov)找到了解决方案,请参阅本文底部的评论!]

希望该标题具有足够的描述性。因此,目标是在功能中配置显示模板,但也要使用它–即提供某种类型的页面,该页面上具有预先配置的Content Search Web部件,其中‘points to’自定义显示模板。我认为这种情况很普遍– you’d在许多地方使用它,例如汇总一些具有特定外观的新闻文章。我使用的过程是任何经验丰富的SharePoint开发人员可能期望的过程:

  1. 在页面上使用正确的设置配置CSWP
  2. 导出Web部件以获取XML
  3. 放入功能中的AllUsersWebPart元素
  4. 检查设置一切看起来不错
  5. 测试

配置的关键点’对这条线很感兴趣,但是在此阶段看起来一切都很好:

<property name="ItemTemplateId" type="string">〜sitecollection / _catalogs /母版页/Display Templates/Content Web Parts/Item_Picture3Lines_COB_blue.js</property>

整个Web部件的XML如下(“ItemTemplateId”是要列出的最后一个属性):

结果是CSWP配置的各个方面似乎都生效了, 的custom Display Template所以. 应用所有其他属性,因此搜索查询可以正常工作并显示正确的项目-但是外观是由Google提供的即用型品牌‘Item_Picture3Lines.js’模板(即不是我的‘Item_Picture3Lines_COB_blue.js’ file). What’奇怪的是,如果您随后编辑页面,则会发现您的自定义模板确实可供选择(请参阅本文的第一张图片),并且选择它的效果很好,并且可以应用商标。起初,我认为这是格式方面的问题,或者‘供应顺序’问题,并提出一些想法(将内容分解为具有依赖项的多个功能等)–没有任何效果,因此是时候推出Reflector Pro。

经过漂亮的取证‘调试SP2013代码’调查(我的一个同事独立地跟踪了我的步骤,谢谢Hrayr!),这对我来说似乎是一个可能的错误。我们还尝试了2013年3月公共更新前后的环境,但结果却相同。从本质上讲,供应过程最终会调用ContentBySearchWebPart类本身中的某些代码,尤其是称为 IsTemplateLocationValid。我们看到一项检查似乎期望路径以“〜sitecollection / _catalogs /母版页”(尽管在XML中以这种方式指定了该值,但早期的SharePoint代码已删除了该值),因此该操作将失败(单击以查看大图)– and sorry if you’不要进入Visual Studio‘Dark’ theme!):

没有sitecollection令牌的自定义模板

..和 下一个检查期望存在SPContext。但是,不是’t! I’我不确定原因,因为该功能是通过SharePoint中的浏览器激活的‘激活网站功能’以我为例,但绝对没有SPContext。所以在这两次检查之间,我’d期望一个人成功。我可以’不能帮忙,但认为SharePoint 2013当前存在一个小错误-在此配置过程中预计会出现SPContext,但无论出于何种原因,’t。我之所以这样说,部分原因是因为我注意到,即使对于开箱即用的模板,其价值也来自剥离的“~sitecollection” token:

没有SiteCollection令牌2的OOTB模板

我还尝试使用* just *文件名:

<property name="ItemTemplateId" type="string">Item_Picture3Lines_COB_blue.js</property>

..但是页面无法加载(黑屏,HTML无法正确输出),ULS显示以下运行时错误:

访问/SitePages/CSWP_Provisioned.aspx时出现应用程序错误,错误=无法为以下项创建缓存安全URL"item_picture3lines_cob_provisioned.js", 文件未找到。请验证文件是否存在于布局目录下。 
在Microsoft.SharePoint.Utilities.SPUtility.MakeBrowserCacheSafeLayoutsUrl(字符串名称,可本地化的布尔值,Int32 requiredVersion)    

可能的解决方案

我大致认为这些是选择:

  1. 使用AllUsersWebPart手动修复要在其中添加Content Search Web部件的任何页面–即,手动编辑页面,在Web部件属性中选择“显示模板”,然后保存页面。
  2. 仅本地 -运行一些服务器端代码(例如在功能接收器中)以解决问题。使用SPLimitedWebPartManager更新Web部件属性。
  3. 对于Office 365 –运行一些客户端代码(JSOM或CSOM)来修复Web部件。

我不’认为任何代码编写都将面临巨大挑战–如果没有其他人做,我可能会很快做:)但是,现在,我只想强调这个问题。您看到其他行为了吗?请发表评论,让我知道是否可以!

17条评论:

伊万·涅加诺夫(Ivan Neganov)说过...

谢谢克里斯,这对我们来说是非常有价值的职位,时机非常好-我们只是在同一个问题上挣扎。我在想如果我们"spoil" the "~sitecollection"令牌,以便它不会'太早解决,这个策略对我们有用。只需简单地将〜换成波浪号即可。例如:
〜sitecollection/_catalogs/masterpage/Display Templates/Content Web Parts/Item_ContentRotatorItem.js

伊万·涅加诺夫(Ivan Neganov) said...

我刚才建议的代字号转义已通过博客引擎转换为实际的代字号字符。再试一次:逃脱的道路应该是:&#126; sitecollection / _catalogs / masterpage /显示模板/内容Web部件/Item_ContentRotatorItem.js

克里斯·奥'Brien说过...

@伊凡

您're right! I'经过测试,并且配置非常完美-很好的发现:)如果有机会,我可能会尝试逐步调试器,并添加进一步的注释,详细说明代码现在采用的路径。

但是无论如何,非常感谢您分享您的发现!

克里斯。

斯瓦蒂·贾恩(Swati Jain)说过...

克里斯,你好

像在SharePoint 2010中一样,是否可以使用以下方法获取Webpart和Dispalytemplate的工件'Save as Template'然后将其导出到Visual Studio?

斯瓦蒂

克里斯·奥'Brien说过...

@Swati,

是的,可以,但是您'将需要编辑XML,以便显示模板的路径使用上面的代字号解决方法。

HTH,

克里斯。

未知说过...

关于配置的不错的文章。
我面临带有自定义显示模板的Content Search Web部件的问题。
我想根据导航显示发布的页面内容。
我可以获取内容,但是由于我正在显示HTML,即PublishingPageContent类型,
对于较长的HTML页面,它确实会向我显示整个页面。

我尝试创建自己的显示模板和现成的显示模板,
但在所有情况下,它仅显示部分HTML内容。

如何创建显示模板,以显示完整的HTML内容而不是链接?

匿名 said...

出色的撰写,并且上述解决方法解决了该问题!但是,我在设置时一直遇到问题´NumberOfItems`。在为WP设置3以外的设置时,将其忽略。知道可能是什么问题吗?

提前致谢!
罗尔

未知说过...

我似乎已经在这个问题上归零了'debugging'显示模板。
我拥有的HTML< table >2行5列的标记。桌子很宽,端到端覆盖。
由于某种原因,托管属性'PublishingPageContentOWSHTML'以及相应的已爬网属性
这是为'Page Content'网站栏不会抓取< table > markup accurately
并且在表格之后没有获取内容。 SharePoint爬网发布HTML内容中的错误?

迈克·戈尔贡内 said...

克里斯,你好

I'm currently trying to deploy control and item display templates and I followed the steps 这里 :

http://borderingdotnet.blogspot.com/2013/03/how-to-deploy-display-templates-via.html

我从OOTB Control_ListWithPaging.html和Item_PictureOnTop.html文件创建了两个文件

但是,在部署并运行功能之后"correctly"那里是html文件,并且生成了.js文件(在Content Web Parts文件夹中)'出现在Web部件的下拉列表中。

关于为什么他们不愿意't appear?

克里斯·奥'Brien说过...

@麦克风,

没有看到你'做完了,我的直觉是你不't正确设置了显示模板的列表项属性。特别要检查'TargetControlType'设置以确保您指定这是与Content Search Web部件一起使用的显示模板。

HTH,

克里斯。

埃斯本说过...

@Chris:谢谢,这篇文章为我节省了数小时的SharePoint挫折感

@Ivan:谢谢,我花了5分钟的搜索/替换时间才能使我的显示模板正常工作。

维沙尔·辛格说过...

@ Ivan,@ Chris Brilliant!简直太聪明了。

LCrespo说过...

克里斯的另一篇好文章!

芝加哥布莱恩说过...

NOTE: 显示模板, like other assets in the Master Page Gallery, must be Published in order for everyone to see them. Once you have completed your edits, return to the Mater Page Gallery and Publish a Major Version of the files so that your users will be able to see them.

网站设置,网站集管理,转到顶级网站设置

从顶级网站-网站集管理员-搜索结果类型

从顶部的第一句话链接到"制作HTML中的显示模板。"

未知说过...

感谢您的替代方法,将〜替换为&#126 for cswp参数中的templateid。
它挽救了我的生命...恭喜您的帖子质量。

julienduprat@hotmail.fr

未知说过...


我已映射了新的托管属性,并且该属性不会显示在“链接URL”下,而我键入它后就神奇地出现了。您文章中的某些内容触发了这种想法:)

如果我们见面,我要么想给你一个拥抱,要么给你买一杯饮料。自六月以来,我一直在从事CSWP的工作,终于找到了这些很棒的文章。

谢谢你,谢谢你,谢谢你!!!!

最亲切的问候,
辛西娅

克里斯·奥'Brien说过...

噢,很高兴能帮助辛西娅!很高兴听到您的工作正常,并感谢您的信息。

COB。

P.S. Hugs, drinks or coffee always accepted 这里 ;)