воскресенье, 22 декабря 2013 г.

Ручное создание ссылки (Связь с документом) на документ в SharePoint 2010.

Не так давно в нашей компании появилась потребность в создании системы документооборота. В частности требовался функционал согласования документов и хранения всех листов согласования в отдельной библиотеке, но при этом иметь к ним доступ из Архива договоров через связь с документом. О рабочих процессах и автоматизации на эту тему написана целая туча статей. Это не удивительно ведь ни один продукт не будет так работать с MS офисом как MS портал. И так приступим.
Данный тип содержимого позволяет хранить ссылку на документ в библиотеке документов вместо самого документа. Это очень удобно для документов, которые хранятся в HTTP (S) Referenceable месте. При добавлении элемента в библиотеке документов и классифицируется как  тип контента "Связь с документом". ASPX страница создается и хранится в библиотеке документов в виде файла. Эта страница используется для перенаправления и открытия файла в месте, где связь с документом фактически проживает. Содержимое  ASPX файла:

<%@ Assembly Name='Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' %>
<%@ Register TagPrefix='SharePoint' Namespace='Microsoft.SharePoint.WebControls' Assembly='Microsoft.SharePoint' %>
<%@ Import Namespace='System.IO' %>
<%@ Import Namespace='Microsoft.SharePoint' %>
<%@ Import Namespace='Microsoft.SharePoint.Utilities' %>
<%@ Import Namespace='Microsoft.SharePoint.WebControls' %>
<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<Head> <META Name='progid' Content='SharePoint.Link'>
<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:URL msdt:dt="string">{0}, {0}</mso:URL>
<mso:ContentType msdt:dt="string">Link to a Document</mso:ContentType>
</mso:CustomDocumentProperties>
</xml><![endif]-->
</head>
    <body>
        <form id='Form1' runat='server'>
            <SharePoint:UrlRedirector id='Redirector1' runat='server' />
        </form>
    </body>
</html>

Чтож, создадим обычный текстовый файл. Для простоты я создал в корне диска C:\Template.txt и поместим туда вышеуказанный код. Именно этот файл мы и будем изменять при добавлении новой "Связи с документом", а конкретно нас интересует строка:

<mso:URL msdt:dt="string">{0}, {0}</mso:URL>
которая как раз таки и отвечает за транспортировку нас к файлу.
Далее открываем Visual Studio  и вставляем код. Для тестирования можно сделать обычную Web Part. И так:
using ( SPSite oSite = new SPSite( "http://Ваш адрес" ) ) {
    using ( SPWeb oWeb = oSite.OpenWeb( ) ) {
        SPList list = oWeb .Lists["Имя библиотеки"];
        //Добавляем ссылку на файл которая будет записана.
        string fileLinkUrl = "http://Ссылка на Ваш файл";
        //Начинаем редактирование заготовленного файла Template.txt
        // Помним, что для использования StringBuilder, TextReader нужно объявить в Reference  System.text 
        StringBuilder builder = new StringBuilder();
        using ( TextReader reader = new StreamReader( @"C:\Template.txt" ) ) {
            builder.Append( reader.ReadToEnd() );
        }
        //Заменяем в открытом файле параметр {0} на ссылку
        builder.Replace( "{0}", fileLinkUrl );
        //Создаем непосредственно файл в библиотеке и говорим, что он .aspx обязательно.
        SPFile file = list.RootFolder.Files.Add( "Имя нашей ссылки.aspx", UTF8Encoding.UTF8.GetBytes(builder.ToString()));
        //Ну и обновляем библиотеку
        SPListItem item = file.Item;
        item["Content Type"] = "Связь с документом";
        SPFieldUrlValue itemUrl = new SPFieldUrlValue();
        itemUrl.Description = "Создано с типового файла";
        itemUrl.Url = fileLinkUrl;
        item["URL"] = itemUrl;
        //Утверждаем изменения
        item.Update();
    }
}

В общем-то всё. Меняем в коде значения на свои и говорим Deploy.
Спасибо за внимание и извиняюсь за форматирование текста - это моя первая статья.


Комментариев нет:

Отправить комментарий