Как более правильно отобразить файловые результаты поиска
Еще один кусочек знаний с последнего проекта.
У клиента была веб часть, которая выглядела точно так же, как и список файлов, но это была веб часть Content Search и она отображала файлы, найденные по определенному критерию на подсайтах.
Клиента не устраивало, что ссылки не предлагают открыть Word/Excel, а вместо этого просто предлагают скачать файл. Хочу, говорит, чтобы работало так же, как и просто в библиотеке документов.
Начал разбираться.
Было несколько причин.
Первая - в результатах поиска использовалось управляемой свойство (managed property) Path.
Это очень простое свойство, которое выдает путь до объекта.
Примерно так
https://sp131:82/Documents/excel1.xlsx
Но нам нужно было, чтобы ссылки учитывали OWA или Excel Services.
Я нашел вот этот пост.
https://www.eliostruyf.com/three-useful-managed-properties-for-working-with-office-web-apps/
Кажется это единственный пост, в котором можно найти описание вот этих свойств:
• ServerRedirectedURL
• ServerRedirectedPreviewURL
• ServerRedirectedEmbedURL
Итого я использовал ServerRedirectedURL. На полноценной ферме у клиента результат выглядел примерно так :
https://server/_layouts/WopiFrame.aspx?sourcedoc={E526E4B1-6759-448F-B6C6-0C67E942173B}&file=Documents/excel1.xlsx&action=default&DefaultItemOpen=1
А на моей локальной так :
https://sp131:82/_layouts/15/xlviewer.aspx?id=/Documents/excel1.xlsx&DefaultItemOpen=1
Другой важный момент - как работают ссылки. В самой библиотеке документов ссылки пытаются открыть Word/Excel. В результатах поиска этого не происходило.
Вообще говоря, есть настройка, которая описывает данное поведение.
https://technet.microsoft.com/en-us/library/ee837425.aspx
Можно найти в разделе "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>