Как более правильно отобразить файловые результаты поиска


Еще один кусочек знаний с последнего проекта.
У клиента была веб часть, которая выглядела точно так же, как и список файлов, но это была веб часть Content Search и она отображала файлы, найденные по определенному критерию на подсайтах.

Клиента не устраивало, что ссылки не предлагают открыть Word/Excel, а вместо этого просто предлагают скачать файл. Хочу, говорит, чтобы работало так же, как и просто в библиотеке документов.

Начал разбираться.
Было несколько причин.

Первая - в результатах поиска использовалось управляемой свойство (managed property) Path.
Это очень простое свойство, которое выдает путь до объекта.

Примерно так
http://sp131:82/Documents/excel1.xlsx

Но нам нужно было, чтобы ссылки учитывали OWA или Excel Services.

Я нашел вот этот пост.

http://www.eliostruyf.com/three-useful-managed-properties-for-working-with-office-web-apps/
Кажется это единственный пост, в котором можно найти описание вот этих свойств:

• ServerRedirectedURL
• ServerRedirectedPreviewURL
• ServerRedirectedEmbedURL

Итого я использовал ServerRedirectedURL. На полноценной ферме у клиента результат выглядел примерно так :

http://server/_layouts/WopiFrame.aspx?sourcedoc={E526E4B1-6759-448F-B6C6-0C67E942173B}&file=Documents/excel1.xlsx&action=default&DefaultItemOpen=1

А на моей локальной так :

http://sp131:82/_layouts/15/xlviewer.aspx?id=/Documents/excel1.xlsx&DefaultItemOpen=1

Другой важный момент - как работают ссылки. В самой библиотеке документов ссылки пытаются открыть Word/Excel. В результатах поиска этого не происходило.

Вообще говоря, есть настройка, которая описывает данное поведение.
https://technet.microsoft.com/en-us/library/ee837425.aspx

2016-07-18_16-27-06

Можно найти в разделе "advanced settings" библиотеки документов.

Ссылки в библиотеке документов выглядели так:

При настройке "open in the client application".

<a class="ms-listlink ms-draggable" href="/Documents/doc1.docx" onmousedown="return VerifyHref(this,event,'0','SharePoint.OpenDocuments','')" onclick="return DispEx(this,event,'TRUE','FALSE','FALSE','SharePoint.OpenDocuments.3','0','SharePoint.OpenDocuments','','','','1','1','0','0x7fffffffffffffff')" dragid="1" draggable="true">doc1</a>

При настройке "open in the browser".

<a class="ms-listlink ms-draggable" href="/Documents/doc1.docx" onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')" onclick="return DispEx(this,event,'TRUE','FALSE','FALSE','SharePoint.OpenDocuments.3','1','SharePoint.OpenDocuments','','','','1','1','0','0x7fffffffffffffff')" dragid="1" draggable="true">doc1</a>

В моем случае клиента устроило, что мы всегда выбираем первый вариант.
Итоговый код:


<!--#_
var linkURL = $getItemValue(ctx, "Path");
linkURL.overrideValueRenderer($urlHtmlEncode);
var ServerRedirectedURLValue = '';
var ServerRedirectedURL = $getItemValue(ctx, "ServerRedirectedURL");
ServerRedirectedURL.overrideValueRenderer($urlHtmlEncode);
ServerRedirectedURLValue = ServerRedirectedURL.defaultValueRenderer(ServerRedirectedURL);
if ( (ServerRedirectedURLValue == null) || (ServerRedirectedURLValue == undefined) || (ServerRedirectedURLValue == ''))
ServerRedirectedURLValue = linkURL.defaultValueRenderer(linkURL);
var onmousedown = "return VerifyHref(this,event,'0','SharePoint.OpenDocuments','1" +ServerRedirectedURLValue +"')";
var onclick = "return DispEx(this,event,'TRUE','FALSE','FALSE','SharePoint.OpenDocuments.3','0','SharePoint.OpenDocuments','','1"+ServerRedirectedURLValue+"','','2','0','0','0x7fffffffffffffff')";
_#-->
<a class="cbs-Line1Link ms-noWrap ms-displayBlock"
onmousedown="_#= onmousedown =#_"
onclick="_#= onclick =#_"
href="_#= linkURL =#_" title="_#= $htmlEncode(line1.defaultValueRenderer(line1)) =#_" id="_#= line1LinkId =#_">_#= line1 =#_</a>

Comments (0)

Skip to main content