пятница, 5 августа 2011 г.

Программный доступ к элементам навигации SharePoint

Начну с того что настройка навигации осуществляется на странице «Параметры структуры переходов узла».


Доступ к этой странице можно получить через параметры сайта перейдя к пункту «Переходы», либо (при включённой публикации) через пункт главного меню «Изменить структуру переходов».

По отношению к сайтам навигация бывает
  • Глобальная
  • Текущая
По расположению на странице, навигация делится на
  • Верхнюю панель навигации
  • Панель быстрого запуска
Глобальная навигация — навигация общая для всех сайтов, в текущей коллекции сайтов.
Текущая навигация — это, соответственно, навигация, присущая текущему сайту.
Верхняя панель навигации — панель, находящаяся под заголовком и логотипом, обычно отображающая названия сайтов в коллекции:
Панель быстрого запуска — левая панель, содержащая ссылки на библиотеки документов, ссылки и т.п.:

Программный доступ к навигации осуществляется через объект Navigation, находящийся в SPWeb.
//Глобальная навигация
var globalNodes = web.Navigation.GlobalNodes;
//Ветвь домашней страницы
var homeNode = web.Navigation.Home;
//Быстрый запуск
var quickLaunch = web.Navigation.QuickLaunch;
//Верхняя панель навигации
var topNavigationBar = web.Navigation.TopNavigationBar;

Каждый из этих элементов (кроме Home) представляет собой коллекцию ветвей навигации (SPNavigationNode).
Рассмотрим основные их свойства:
foreach (SPNavigationNode node in topNavigationBar)
{
    //Название
    var nodeTitle = node.Title;
    //URL-адрес
    var nodeUrl = node.Url;
    //Видимость
    var nodeVisibility = node.IsVisible;
    //Локальность
    var nodeTargetLocation = node.IsExternal;
    //Аудитория
    var nodeAudience = node.Properties["Audience"] == null ? string.Empty : node.Properties["Audience"].ToString();
    //Тип
    var nodeType = node.Properties["NodeType"] == null ? string.Empty : node.Properties["NodeType"].ToString();
    //Описание
    var nodeDescription = node.Properties["Description"] == null ? string.Empty : node.Properties["Description"].ToString();
    //Вариант открытия ссылки
    var nodeTarget = node.Properties["Target"] == null ? string.Empty : node.Properties["Target"].ToString();
    //Вложенные ветви
    var subNodes = node.Children;
}

Рассмотрим каждый пункт отдельно.
Название, URL-адрес, Вариант открытия ссылки, Описание и Аудиторию мы можем увидеть в окне создания/изменения ссылки на сайте.

Вариант открытия ссылки — возвращает либо пустую строку или «_self», и тогда ссылка будет открываться в том же окне, либо возвращает значение «_blank» и ссылка будет открываться в новом окне.
Про аудитории мы уже говорили, см. предыдущие посты.
Видимость —  данные параметр должен определять, скрыта ли ссылка, но он, к сожалению не работает. 
Локальность — определяет, указывает ли ссылка на локальный ресурс или внешний (true — внешний)
Тип ветви — может принимать следующие значения (все возможные значения можно найти в перечислении NodeTypes):
  • Area — для элементов типа «Сайт»:
  • Heading — для элементов типа «Папка»:
  • AuthoredLinkPlain — для элементов типа «Ссылка»:
  • Page — для элементов типа «Страница»:
Теперь поговорим о настройках навигации, о программном доступе к ним:
Для доступа к ним нам понадобится объект PublishingWeb (находится в библиотеке Microsoft.SharePoint.Publishing).
var publishingWeb = PublishingWeb.GetPublishingWeb(web);

//Показать дочерние узлы
var showSubSites = publishingWeb.IncludeSubSitesInNavigation;
//Отображать страницы
var showPages = publishingWeb.IncludePagesInNavigation;
//Тип сортировки
var ordering = publishingWeb.NavigationOrderingMethod;
//Поле сортировки
var sotringField = publishingWeb.NavigationAutomaticSortingMethod;
//Направление сортировки
var sortDirection = publishingWeb.NavigationSortAscending;

(для SharePoint 2010 эти свойства располагаются в объекте publishingWeb.Navigation)
Отображать страницы — определяет, надо ли отображать страницы из системной библиотеки «Страницы»
Тип сортировки — перечисление, может принимать значения:
  • OrderingMethod.Automatic — Сортировать автоматически
  • OrderingMethod.Manual — Сортировать вручную
  • OrderingMethod.ManualWithAutomaticPageSorting — Сортировать страницы автоматически
Поле сортировки — перечисление, может принимать значения:
  • AutomaticSortingMethod.Title — Сортировка по названию
  • AutomaticSortingMethod.CreatedDate — Сортировка по дате создания
  • AutomaticSortingMethod.LastModifiedDate — Сортировка по дате изменения
Направление сортировки — по алфавиту или в обратном порядке (true — по алфавиту)
Кроме этих свойств, PublishingWeb даёт доступ к текущей структуре навигации:
var currentNodes = publishingWeb.CurrentNavigationNodes;

А ещё проверить видимость элемента. Так например проверяется видимость страниц:
if (node.GetProperty("NodeType") == NodeTypes.Page.ToString())
{
    if (!publishingWeb.IncludePagesInNavigation)
        return false;

    var pPages = publishingWeb.GetPublishingPages();
    var pPage = pPages[nn.Url];
    if (pPage != null && !pPage.IncludeInGlobalNavigation)
        return false;
} 

Всем приятного программирования!

пятница, 29 июля 2011 г.

SharePoint и Opera

Ещё со времён 2007-го SharePoint'а существует проблема работы с сайтом из Оперы.
На сайте планирования поддержки браузера для SharePoint этот браузер даже не указан, т.о. Microsoft его просто игнорирует и, следовательно, официально (или скорее не официально) он не поддерживается.

Самая большая проблема при попытке работать в SharePoint из Оперы — это полная неработоспособность меню. Также есть ряд других проблем: с полосами прокрутки, панелью настройки веб-части и т.д.

Все это решается довольно просто. Нужно лишь указать браузеру маскироваться под Firefox.
Делается это так:
Открываем сайт SharePoint.
В контекстном меню сайта выбираем пункт Edit Site Preferences… (Настройки для сайта):

В диалоговом окне Site Preferences (Настройки для сайта) переходим к вкладке Network (Сеть):

И устанавливаем в параметре Browser Identification (Идентификация браузера) значение Mask as Firefox (Маскироваться под Firefox).
После этого необходимо обновить страницу. Все меню и прочие плюшки начинают работать!

P.S. Для тех кто использует SharePoint как интернет сайт могу указать статью, решающую часть проблем с Оперой посредством редактирования главных страниц и JavaScript-файлов.

вторник, 12 июля 2011 г.

Использование ObjectDataSource в SharePoint 2010 Visual Web Part

Создаём простейшую визуальную веб-часть.

В контрол добавляем ObjectDataSource (ODS) и что-нибудь его отображающее, допустим DataGrid:

Создаём необходимые для ODS классы — для поиска и для объекта поиска. Неважно, что они делают и возвращают.
Делаем встраивание веб-части и пробуем добавить её на страницу.

Неожиданно получаем следующую ошибку:

«Не удается найти тип объекта данных, указанный в свойстве TypeName ObjectDataSource 'SearchResultsDataSource'.»
или
«The data object type specified in the DataObjectTypeName property of ObjectDataSource ' SearchResultsDataSource' could not be found»

В чём же дело??

А дело в том, что ODS не находит нашу сборку DLL. Соответственно и необходимый тип в ней.

Решения данной проблемы может быть два: 
1. Положить сборку веб-части в папку BIN необходимого сайта (по умолчанию, «C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin\»). Способ не совсем удобный. Но подходит для тех кто изначально добавляет библиотеки в BIN, а не GAC.
2. Поправить файл конфигурации сайта, web.config:
  <configuration>
  <system.web>
    <
compilation>
      <
assemblies>
        <
add assembly="YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fed062df71e7ef1c" />
      </
assemblies>
    </
compilation>
  </
system.web>
</
configuration>

понедельник, 27 июня 2011 г.

Проверка принадлежности текущего пользователя к аудитории для элемента навигации SharePoint

Допустим, имеется набор элементов навигации SPNavigationNodeCollection (например, web.Navigation.TopNavigationBar или web.Navigation.QuickLaunch).
Необходимо выбрать из них элементы в соответствии с установленной для них аудиторией относительно текущего пользователя.


Для данной задачи я создал следующий класс:

public static class AudienceHelper
{
    public static bool UserInAudience(this SPNavigationNode navigationNode)
    {
        //Необходимые нам данные об аудитории находятся в свойстве элемента
        if (navigationNode.Properties["Audience"] == null)
            return true;

        var audiencesLine = navigationNode.Properties["Audience"].ToString();

        /*
         * В качестве значения для аудитории может быть установлено значение одного из трёх типов:
         * Аудитории SharePoint
         * Группы безопасности
         * Группы SharePoint
         *
         * Информация об аудитории представляет собой строку вида "MyAudience;;MySecurityGroup;;MySPGroup"
         * Значения между ";;" могут отсутствовать, либо быть набором из нескольких значений разделённых ","
         * Для примера,
         * аудитория SharePoint задаётся значением "MyAudience;;;;",
         * две группы SharePoint - значением ";;;;MySPGroup1,MySPGroup2"
         */

        var audiencesList = audiencesLine.Split(new[] { ";;" }, StringSplitOptions.None).ToList();
        if (string.IsNullOrEmpty(audiencesLine) || audiencesList.Count < 3)
            return true;

        /* Для проверки наличия текущего пользователя в аудитории необходим объект AudienceLoader
         * из библиотеки Microsoft.Office.Server*/
        var audienceLoader = AudienceLoader.GetAudienceLoader();

        #region Global audience

        if (!string.IsNullOrEmpty(audiencesList[0]))
        {
            var audiences = audiencesList[0].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfGlobalAudience))
                return true;
        }

        #endregion

        #region
Security group

        if (!string.IsNullOrEmpty(audiencesList[1]))
        {
            var audiences = audiencesList[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfDL))
                return true;
        }

        #endregion

        #region
SharePoint group

        if (!string.IsNullOrEmpty(audiencesList[2]))
        {
            var audiences = audiencesList[2].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (audiences.Any(audienceLoader.IsUserMemberOfSharePointGroup))
                return true;
        }

        #endregion

        //Если пользователь не содержится не в одном из типов аудиторий возвращаем False
        return false;
    }
}


Теперь можем перебрать все элементы:
foreach (var navItem in web.Navigation.TopNavigationBar.Cast<SPNavigationNode>().Where(nn => nn.IsVisible && nn.UserInAudience()))
{
    //Действия с элементом   
}

среда, 22 июня 2011 г.

Ошибка отображения списка в режиме таблицы

Давно была у меня ошибка при отображении списка в режиме таблицы.
И недавно (как всегда когда совсем приспичит) решил я её всё-таки исправить.

Ошибка была следующая:
"Невозможно отобразить этот список в представлении таблицы данных по одной или нескольким причинам:
- не установлен компонент электронной таблицы, совместимый с Windows SharePoint Foundation; 
- ваш веб-браузер не поддерживает элементы управления ActiveX.
- компонент неправильно настроен для 32-разрядной или 64-разрядной поддержки."
либо
"The list cannot be displayed in Datasheet view for one or more of the following reasons:
- A datasheet component compatible with Windows SharePoint Foundation is not installed.
- Your Web browser does not support ActiveX controls.
- A component is not properly configured for 32-bit or 64-bit support."

Вроде всё на месте, офис установлен, ActiveX включён, прав везде хватает, а не работает.

После некоторого поиска решение было найдено. Проблема оказалась всё же в офисе, вернее в том что он x64-разрядный. Необходимо скачать и установить некий "2007 Office System Driver: Data Connectivity Components".
После чего всё встаёт на свои места.
Ссылка на страницу поддержки Microsoft. 

воскресенье, 8 мая 2011 г.

SharePoint Solution Installer Rus

Также выкладываю аналогичный русификатор для оригинального установщика решений (под SharePoint 2007).

Скачивать тут.

Установка: Поместить содержимое архива в папку с инсталлятором.

суббота, 23 апреля 2011 г.

SharePoint 2010 Solution Installer

По просьбам устанавливающих сделал апгрейд установщика решений SharePoint под SharePoint 2010.
А также добавил русскую локализацию.

Скачать можно тут!
It can be downloaded here!

P.S. Не совместим с WSS 3.0 и MOSS 2007.
P.P.S. Об ошибках и неточностях перевода пишите в комментариях. Постараюсь всё учесть.
Автор обновления не претендует на авторство самого приложения.