Есть такой шаблон сайта в SharePoint – корпоративный центр поиска, есть еще обычный центр поиска и FAST. Так вот с ним все воюют, почему-то там нет горизонтального меню навигации сверху как в других сайтах. Почему нет меню быстрого запуска – понятно, вместо него панель улучшений. Так или иначе, но из-за отсутствия меню нельзя вернуться на «основной» сайт и это всех выводит из себя.

Центр поиска использует страницу minimal.master, а многие другие сайты используют v4.master. Все, что требуется – это скопировать из разметки меню и вставить его в minimal.master.

Итак, вот один из стандартных сайтов, меню на месте:

Создаем центр поиска:

Смотрим на сайт, меню нет:

Теперь нужно открыть SharePoint Designer и изменить страницу minimal.master. Если Вы сделаете это на сайте поиска, то ничего не произойдет. Сайт поиска является дочерним и использует мастер страницу корневого сайта семейства. Примечательно, что коллекция мастер страниц на дочернем сайте есть в виртуальной файловой системе, но в веб интерфейсе ссылка в параметрах сайта ведет на корневой сайт семейства.

Это можно проверить при помощи PowerShell:

$web = get-spweb http://portal/search

$web | select MasterUrl, CustomMasterUrl | format-list

 

Результат:

PS C:\Users\Администратор> $web = get-spweb http://portal/search

$web | select MasterUrl, CustomMasterUrl | format-list

MasterUrl : /_catalogs/masterpage/v4.master

CustomMasterUrl : /_catalogs/masterpage/minimal.master

 

Напоминаю, что путь считается от корня семейства сайтов, а страницы основанные на макетах публикации используют CustomMasterUrl, в то время как стандартные страницы и страницы настройки используют MasterUrl.

Теперь открываем страницу v4.master при помощи SharePoint Designer.

Находим такой элемент:

<div id="s4-topheader2" class="s4-pr s4-notdlg">

И копируем его целиком:

Это вот такой кусок разметки:

<div id="s4-topheader2" class="s4-pr s4-notdlg">

<a name="startNavigation"></a>

<div id="s4-searcharea" class="s4-search s4-rp">

<asp:ContentPlaceHolder id="PlaceHolderSearchArea" runat="server">

<SharePoint:DelegateControl runat="server" ControlId="SmallSearchInputBox" Version="4"/>

</asp:ContentPlaceHolder>

<span class="s4-help">

<span style="height:17px;width:17px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"><a href="#" style="height:17px;width:17px;display:inline-block;" onclick="TopHelpButtonClick('HelpHome');return false" accesskey="<%$Resources:wss,multipages_helplink_accesskey%>" id="TopHelpLink" title="<%$Resources:wss,multipages_helplinkalt_text%>" runat="server"><img src="/_layouts/images/fgimg.png" alt="<%$Resources:wss,multipages_helplinkalt_text%>" style="left:-0px !important;top:-309px !important;position:absolute;" align="absmiddle" border="0" runat="server" /></a></span>

</span>

</div>

<div class="s4-rp s4-app">

</div>

<div class="s4-lp s4-toplinks">

<asp:ContentPlaceHolder id="PlaceHolderTopNavBar" runat="server">

<asp:ContentPlaceHolder id="PlaceHolderHorizontalNav" runat="server">

<SharePoint:AspMenu

ID="TopNavigationMenuV4"

Runat="server"

EnableViewState="false"

DataSourceID="topSiteMap"

AccessKey="<%$Resources:wss,navigation_accesskey%>"

UseSimpleRendering="true"

UseSeparateCss="false"

Orientation="Horizontal"

StaticDisplayLevels="2"

MaximumDynamicDisplayLevels="1"

SkipLinkText=""

CssClass="s4-tn"/>

<SharePoint:DelegateControl runat="server" ControlId="TopNavigationDataSource" Id="topNavigationDelegate">

<Template_Controls>

<asp:SiteMapDataSource ShowStartingNode="False" SiteMapProvider="SPNavigationProvider" id="topSiteMap" runat="server" StartingNodeUrl="sid:1002"/>

</Template_Controls>

</SharePoint:DelegateControl>

</asp:ContentPlaceHolder>

</asp:ContentPlaceHolder>

</div>

</div>

 

Теперь открываем страницу minimal.master и находим элемент:

<div>

<asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb" runat="server" />

</div>

Над ним вставляем то, что скопировали ранее. Сохраняем страницу, пробуем посмотреть в браузере:

Упс, ошибка… Если найдете и удалите, еще одна будет…

Находим и удаляем лишнее:

<a name="startNavigation"></a>

<div id="s4-topheader2" class="s4-pr s4-notdlg">

<div id="s4-searcharea" class="s4-search s4-rp">

<asp:ContentPlaceHolder id="PlaceHolderSearchArea" runat="server">

<SharePoint:DelegateControl runat="server" ControlId="SmallSearchInputBox" Version="4"/>

</asp:ContentPlaceHolder>

<span class="s4-help">

<span style="height:17px;width:17px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"><a href="#" style="height:17px;width:17px;display:inline-block;" onclick="TopHelpButtonClick('HelpHome');return false" accesskey="<%$Resources:wss,multipages_helplink_accesskey%>" id="TopHelpLink" title="<%$Resources:wss,multipages_helplinkalt_text%>" runat="server"><img src="/_layouts/images/fgimg.png" alt="<%$Resources:wss,multipages_helplinkalt_text%>" style="left:-0px !important;top:-309px !important;position:absolute;" align="absmiddle" border="0" runat="server" /></a></span>

</span>

</div>

 

Все сохраняем, смотрим на результат:

Ура! Меню на месте. Теперь, если в меню будут еще пункты, то они здесь отобразятся, все счастливы. Почему Microsoft сразу так не мог сделать?