четверг, 13 августа 2015 г.

Что делать если шаблон списка не отображается на странице "Добавить приложение"?

Иногда бывает необходимо развернуть уже существующий список с данными на другой коллекции сайтов/ферме SharePoint 2013.
Часто (если структура и размер списка позволяет) я использую для этого стандартные действия через браузер:
  1. Создать шаблон списка 
  2. Скачать файл шаблона (.stp) себе на ПК 
  3. Загрузить скачанный файл в библиотеку шаблонов в новом расположении 
  4. Развернуть новый список по шаблону

Недавно я столкнулся с проблемой: мой шаблон списка, сохраненный через браузер, не отображается на странице "Добавить приложение".

Все рекомендации, которые я нашел в интернете не помогли, пока я не нашел статью 2007 года с описанием подобной проблемы. Привожу описание решения из статьи, модифицированное под SharePoint 2013.

Порядок действий

1. Перейти в Коллекцию шаблонов списков
2. Скачать нужный шаблон на свой ПК
3. Сделать копию файла шаблона, и изменить расширение файла с .stp на .zip
4. Открыть получившийся архив любой соответствующей программой
5. В архиве открыть через Блокнот (или Notepad++) файл manifest.xml
6. Из файла manifest.xml нужно выписать значения параметров: TemplateType, FeatureId

7. Открываем целевой узел, где нужно развернуть список по шаблону и добавляем часть адреса с параметрами:
 https://myportal.ru/testteamsite1/_layouts/15/new.aspx?CustomTemplate=testlist001%2Estp&FeatureId={00bfea71-de22-43b2-a848-c05709900100}&ListTemplate=100

где CustomTemplate - название файла шаблона в Коллекции шаблонов списков,
FeatureId - значение соответствующего параметра из файла manifest.xml,
ListTemplate - значение параметра TemplateType из файла manifest.xml

8. Откроется форма для создания списка. Указываем название и нажимаем "Создать"
9. Создается желаемый список по шаблону с одним элементом как в исходном списке:

Также может быть полезно изменить содержимое .stp файла.
Для этого нужно:
  1. скорректировать содержимое файла manifest.xml
  2. Используя командную строку, перейти к папке, которая содержит manifest файл (используя “cd directoryname)
  3. выполнить команду: makecab.exe manifest.xml mytemplatename.stp
  4. файл .cab должен появиться в папке
  5. нужно переименовать расширение файла .cab в .stp

Внимание! В файле manifest.xml нельзя изменять template ID


Полезные ссылки


четверг, 26 марта 2015 г.

Как лайкать изображения в библиотеке рисунков SharePoint 2013 c помощью JSOM

В статье описан способ проставления "лайков" с помощью JSOM для изображений, расположенных в библиотеке рисунков на портале SharePoint 2013.

Методы для работы с "лайками" в SharePoint 2013

Для начала нам нужно убедиться, что на странице подгружается файл 'reputation.js'.
Простейший код метода для "лайка" изображения приведен в листинге ниже:
 
var listID = "{910B4287-09F5-4942-95FE-171B689722FD}"; //GUID библиотеки рисунков
var itemID = 54; //ID элемента 
var like = true; //установка-снятие 'лайка'

var aContextObject = new SP.ClientContext();
        EnsureScriptFunc('reputation.js', 'Microsoft.Office.Server.ReputationModel.Reputation', function () {
            Microsoft.Office.Server.ReputationModel.
            Reputation.setLike(aContextObject,
                listID,
                itemID, like);

            aContextObject.executeQueryAsync(
                function () {
                    //success
                }, function (sender, args) {
             //fail
                });
        });

Для того, чтобы подсчитать число "лайков" и определить - "лайкал" ли текущий пользователь конкретное изображение или нет, я использую следующий код для метода из листинга:
 
var listID = "{910B4287-09F5-4942-95FE-171B689722FD}"; //GUID библиотеки рисунков
var itemID = 54; //ID элемента 

var context = new SP.ClientContext(_spPageContextInfo.webServerRelativeUrl);
var list = context.get_web().get_lists().getById(listID);
var item = list.getItemById(itemID);
context.load(item, "LikedBy", "ID", "LikesCount");
context.executeQueryAsync(Function.createDelegate(this, function (success) {
 // Check if the user id of the current users is in the collection LikedBy. 
 var likeDisplay = false;
 var $v_0 = item.get_item('LikedBy');
 var itemc = item.get_item('LikesCount');
 if (!SP.ScriptHelpers.isNullOrUndefined($v_0)) {
  for (var $v_1 = 0, $v_2 = $v_0.length; $v_1 < $v_2; $v_1++) {
   var $v_3 = $v_0[$v_1];
   if ($v_3.$1E_1 === _spPageContextInfo.userId) {
    likeDisplay = true;
   }
  }
 }
   alert("Число лайков: " + itemc + ", Пользователь уже проголосовал: " + likeDisplay);

}), Function.createDelegate(this, function (sender, args) {
}));


Очистка  проставленных "лайков" через Powershell

Бывает так, что нужно очистить проставленные "лайки" пользователей в пределах одного списка. В SharePoint 2010 для этого было достаточно отключить/включить функционал рейтингов в настройках списка. В версии 2013 такой способ не сработал, поэтому я написал простой скрипт:
 
if(-not(Get-PSSnapin | Where { $_.Name -eq "Microsoft.SharePoint.PowerShell"}))
{
               Write-Host "Подключение остнастки"
               Add-PSSnapin Microsoft.SharePoint.PowerShell;
} 

$sourceWebURL = "http://test/sites/fotos/"
$sourceListName = "Рисунки1" 

$sourceListFieldCount="Число оценок `"нравится`""
$sourceListFieldUsers="Понравилось пользователям"

$spSourceWeb = Get-SPWeb $sourceWebURL
$spSourceList = $spSourceWeb.Lists[$sourceListName]

$spSourceItems = $spSourceList.Items 

$spSourceItems | ForEach-Object {
    Write-Host $_['ID']
    Write-Host "Before:"+ $_[$sourceListFieldCount] + ","+ $_[$sourceListFieldUsers];
    $_[$sourceListFieldCount]="";
    $_[$sourceListFieldUsers]="";
    $_.Update()
    Write-Host "After:"+  $_[$sourceListFieldCount] + ","+ $_[$sourceListFieldUsers];
}

Полезные ссылки


четверг, 25 сентября 2014 г.

Работа с подсказками в SharePoint 2010

В поисковом сервисе SharePoint 2010 (не Foundation) присутствует механизм, позволяющий отображать подсказки при вводе текста в поисковую строку на странице центра поиска, как показано на рисунке ниже.

Подсказки накапливаются во встроенном словаре  поисковой службы SharePoint следующим образом:
если пользователи ввели в поисковую строку один и тот же запрос более шести раз, и на странице с результатами по этому запросу сделали переход  по более чем шести результатам, то данный запрос (слово или фраза) в дальнейшем будут добавлены в словарь подсказок.
Для того, чтобы это произошло, существует встроенный TimerJob, который называется «Prepare Query Suggestions». По умолчанию он запускается 1 раз в день.

Добавление подсказок

Используем Powershell

С помощью Powershell мы можем сами добавлять слова и фразы в словарь подсказок.
В начале получаем имя поисковой службы, которая будет использоваться для работы с подсказками:
Get-SPEnterpriseSearchServiceApplication


Теперь добавляем наши подсказки:
$searchSSA = Get-SPEnterpriseSearchServiceApplication "Приложение службы поиска"
New-SPEnterpriseSearchLanguageResourcePhrase -SearchApplication  $searchSSA -Language RU-RU -Type QuerySuggestionAlwaysSuggest -Name "Наша фраза"
Start-SPTimerJob -Identity "Prepare Query Suggestions"

С помощью командлета Start-SPTimerJob -Identity "Prepare Query Suggestions" мы запускаем  TimerJob для добавления подсказок в словарь.
После этого, можно выполнить следующий командлет, для получения всего списка подсказок:
Get-SPEnterpriseSearchQuerySuggestionCandidates -SearchApplication $searchSSA


Используем серверный код для непосредственного добавления подсказок в словарь

Здесь и далее в примерах для работы потребуется объявить референсы на сборку Microsoft.Office.Server.Search и использовать пространства имен:
  • Microsoft.Office.Server.Search.Administration
  • Microsoft.Office.Server.Search.Query
SearchServiceApplication searchApp = farm.Services.GetValue<SearchQueryAndSiteSettingsService>().Applications.GetValue<SearchServiceApplication>("Приложение службы поиска") as SearchServiceApplication;
  
Ranking ranking = new Ranking(searchApp);
LanguageResourcePhraseList suggestions = ranking.LanguageResources["RU-RU"].QuerySuggestionsAlwaysSuggestList;
suggestions.AddPhrase(“Ваша фраза”, String.Empty);

После этого нужно запустить “Prepare Query Suggestions” TimerJob и «Ваша фраза» гарантированно добавится в словарь подсказок.

Используем серверный код для добавления подсказок с использованием стандартного механизма

Описание работы стандартного механизма приведено в самом первом разделе. Чтобы им воспользоваться мы должны использовать  нативный метод  RecordClick.
Хотя этот метод присутсвует в списке доступных на странице веб-сервиса Searh.asmx, но воспользоваться им не удасться, т.к. на msdn явно указано, что: «This member is reserved for internal use and is not intended to be used directly from your code.»
Поэтому нам остается использовать только одноименный метод в службе поиска: SearchServiceApplicationProxy.RecordClick Method
private void setRecordClick(string queryStr, string clickedUrl, string ResultsUrl)
        {
            Guid siteGuid = SPContext.Current.Web.Site.ID;
            using (SPSite site = new SPSite(siteGuid))
            {
                SPServiceContext serviceContext = SPServiceContext.GetContext(site);
                SearchServiceApplicationProxy searchAppProxy =
                    ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext));

                string queryId = Guid.NewGuid().ToString();
                string sessionId = Guid.NewGuid().ToString();

                QueryInfo info = new QueryInfo();
                info.QueryGuid = queryId;
                info.SiteGuid = site.ID.ToString();
                info.SessionId = sessionId;
                info.UserName = System.Threading.Thread.CurrentPrincipal.Identity.Name;

                info.QueryString = queryStr;
                info.StartItem = 1;
                info.ClickTime = DateTime.Now;
                info.ClickedUrl = clickedUrl;
                info.ResultsUrl = ResultsUrl;
                info.ClientType = QueryLogClientType.ObjectModel;
                info.SearchTime = DateTime.Now;

                // Send a Click QueryInfo
                info.LogType = QueryLogType.Click;
                searchAppProxy.RecordClick(info);
            }
        }

В качестве аргументов нашего метода setRecordClick() используется три значения:
  1. queryStr – значение поискового запроса
  2. clickedUrl – значение URL адреса, по которому пользователь перешел, выбрав один из результатов  на странице результатов поиска
  3. ResultsUrl - значение URL адреса самой страницы результатов поиска
После выполнения нашего метода, вся информация накапливается в промежуточном словаре и обрабатывается внутренним механизмом SharePoint. Т.о. SharePoint «сам решит» нужно ли добавлять подсказки, сформированные из ваших «рекордкликов» или нет.

Получение подсказок

В стандартном поисковом веб-сервисе Search.asmx присутствует метод GetQuerySuggestions, который позволяет получать подсказки. 
Ниже привожу примеры как это делать через клиентский и серверный код.

Работаем «на клиенте» (JavaScript)

Для примера я воспользуюсь js-библиотекой SPServices. На странице проекта в документации приведена информация о поддержке работы с методом GetQuerySuggestions:  http://spservices.codeplex.com/wikipage?title=Search 

Для работы (помимо подключения js-библиотеки SPServices) потребуется подключить на страницу еще и jQuery (см.рекомендации по используемой версии jQuery на странице http://spservices.codeplex.com/documentation).
Напишем функцию получения подсказок:
function getSuggestions(input) {
    var queryText = "<QueryPacket xmlns='urn:Microsoft.Search.Query' Revision='1000'>"
    queryText += "<Query>"
    queryText += "<PreQuerySuggestions>"
    queryText += "true"
    queryText += "</PreQuerySuggestions>"
    queryText += "<Context>"
    queryText += "<QueryText language='RU-RU' type='STRING'>"
    queryText += input
    queryText += "</QueryText>"
    queryText += "</Context>"
    queryText += "<Range>"
    queryText += "<Count>"
    queryText += "20"
    queryText += "</Count>"
    queryText += "</Range>"
    queryText += "</Query>"
    queryText += "</QueryPacket>";

    $().SPServices({
        operation: "GetQuerySuggestions",
        queryXml: queryText,
        completefunc: function (xData, Status) {
            var outTxt = "";
            $(xData.responseXML).find("GetQuerySuggestionsResult").each(function () {
                //т.к. ответ от веб-сервиса приходит в формате XML, то его нужно преобразовать             
                var xmlDoc = $.parseXML($(this)[0].xml);
                var x = $(xmlDoc);
                x.find("string").each(function () {
                    outTxt += $(this).text() + ',';
                });
            });
            alert(outTxt);
        }
    });
}

В качестве аргумента функции передаем фразу, по которой хотим получить подсказки.
Например:
getSuggestions(“влади”);
В результате получаем набор подсказок, см. рисунок ниже.

Работаем на стороне сервера (C#)

Сам метод получения подсказок выглядит следующим образом:

        private static List<string> getSuggestionsList(string input)
        {
            List<string> result = new List<string>();
            Guid siteGuid = SPContext.Current.Web.Site.ID;
            using (SPSite site = new SPSite(siteGuid))
            {
                SPServiceContext serviceContext = SPServiceContext.GetContext(site);
                SearchServiceApplicationProxy searchAppProxy =
                    ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext));

                string queryId = Guid.NewGuid().ToString();
                string sessionId = Guid.NewGuid().ToString();
                KeywordQueryProperties info = new KeywordQueryProperties();
                info.RowLimit = 10;
                info.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("RU-RU");
                info.QueryText = input;
                System.Collections.Specialized.StringCollection sugg = searchAppProxy.GetQuerySuggestions(info, 8, true, false, false);
                foreach (string s in sugg)
                {
                    result.Add(s);
                }
            }
            return result;
        }
Описание входных параметров метода GetQuerySuggestions приведены на msdn.

Получение исправлений (SpellingSuggestion)

Всем известен функционал предложения исправлений поискового запроса пользователя, который мы часто видим на странице результатов центра поиска в виде подсказки «Возможно, Вы имели ввиду: …»  или “Did you mean:…”

Ниже я привел метод, который позволяет получать такие подсказки:
  
private static string getSpellCheck(string input)
        {
            string result = "";
            Guid siteGuid = SPContext.Current.Web.Site.ID;
            using (SPSite site = new SPSite(siteGuid))
            {
                SPServiceContext serviceContext = SPServiceContext.GetContext(site);
                SearchServiceApplicationProxy searchAppProxy =
                    ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext));

                string queryId = Guid.NewGuid().ToString();
                string sessionId = Guid.NewGuid().ToString();
                KeywordQueryProperties info = new KeywordQueryProperties();
                info.RowLimit = 10;
                info.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("RU-RU");
                info.QueryText = input;
                var sugg = searchAppProxy.Execute(info);
                result = sugg.SpellingSuggestion;
                if (!string.IsNullOrEmpty(result)&&result == input)
                    result = "";                
            }
            return result;
        }   
В результатах запроса Microsoft.Office.Server.Search.Query.ResultTableCollection  есть свойство SpellingSuggestion, которое как раз и выводит исправления. Чтобы его получить, нам достаточно выполнить сам запрос Execute(), и считать данное свойство. Таким образом, передавая в качестве аргумента текст «ивонов», мы получаем исправленное «иванов»:


Полезные ссылки:


четверг, 29 мая 2014 г.

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

При написании клиентского javascript кода иногда возникает ситуация, когда нужно определить - находится ли текущая страница в режиме редактирования или нет. Например, чтобы не выполнять кастомный JS-код в время редактирования страницы с веб-частями.

В этой статье приведены несколько примеров, как это можно сделать в разных версиях SharePoint.

SharePoint 2010 and SharePoint 2013

Следующий вызов вернет истину, если вы находитесь в режиме редактирования, или ложь, если вы находитесь в режиме просмотра:
 
var InEditMode = SP.Ribbon.PageState.Handlers.isInEditMode();

SharePoint 2007

 
var InEditMode =(document.getElementById('MSOLayout_InDesignMode').value ==1 ) ? true : false;
Кстати этот способ работает во всех 3х версиях SharePoint!

Далее

Проверка осуществляется через обычный if:
 
if(!InEditMode){..}

вторник, 6 мая 2014 г.

Работа с GAC

Как скопировать сборку из GAC

Часто в ходе тестирования возникает необходимость скопировать dll-файлы из GAC в локальную папку.

Для этого нужно выполнить следующие действия:
1. в строке “Run” выполнить команду: %windir%\assembly\GAC_MSIL

2. откроется проводник, в котором отобразится содержимое GAC. Нужно найти папку с именем Вашей сборки 
3. проверьте, что папка содержит вашу сборку 
4. Скопируйте сборку в локальную папку
5. Всё готово!

Как установить/удалить сборку из GAC

Установка утилиты gacutil

Gacutil поставляется с Visual Studio. Она является частью Windows SDK и может быть скачана отдельно по ссылке.
Перед установкой проверьте, нет установлена ли уже утилита в папке "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin"
Для установки распакуйте содержимое архива «gacutil.zip» в папку "C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin"

Удаление сборки из GAC

1. откройте  командную строку от имени Администратора (cmd.exe) и запустите команду - 
cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin"
2. для удаления сборки выполните команду: 
gacutil -u имя вашей сборки
Пример:
gacutil -u Company.UserPage


Установка сборки в GAC

1. откройте  командную строку от имени Администратора (cmd.exe) и запустите команду - 
cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin"
2. для установки сборки выполните команду:
gacutil -i "C:\ПУТЬ К НОВОЙ СБОРКЕ\имя файла вашей сборки"
Пример:
gacutil -i "C:\files\Company.UserPage.dll"


Как выгрузить WSP-файл из хранилища решений SharePoint 2010/2013

Используем PowerShell

$farm = Get-SPFarm
$file = $farm.Solutions.Item("solution.wsp").SolutionFile
$file.SaveAs("c:\temp\solution.wsp")


Используем приложение SharePoint.WSPExtractor

Приложение SharePoint.WSPExtractor позволяет выгрузить из хранилища решений любой wsp-файл или сразу несколько нужных wsp-файлов одновременно.
Приложение и исходные файлы можно загрузить из CodePlex.
Имеется две версии приложения для SharePoint 2010 и 2013.

Порядок работы с приложением:

Полезные ссылки

пятница, 10 января 2014 г.

Генерация произвольных файлов формата MS Office 2007/2010 (Word и Excel) в SharePoint 2010 и 2013

Нередко при тестировании и отладке решений для SharePoint нужно загрузить n-ое количество тестовых файлов в библиотеку документов.
Хорошо если наши запросы скромные, и для тестирования достаточно скопировать несколько файлов через "режим проводника" из локальной папки.
Но как быть если таких файлов нужно загрузить не одну тысячу в несколько библиотек?
Один из вариантов - воспользоваться Open XML SDK 2.0 for Microsoft Office.

Пример разработки приложения для генерации произвольных файлов формата MS Word и Excel в SharePoint 

В своей предыдущей статье я уже описывал как начать работу с Open XML SDK 2.0 for Microsoft Office и создать проект в Visual Studio 2010, поэтому повторяться не буду.
Начнем сразу с главного: как генерировать файлы формата MS Office "на лету".

Генерация файла формата MS Word 2007/2010

В данном примере я приведу метод, позволяющий генерировать файл MS Word, содержащий одну строку текста, c использованием Open XML SDK 2.0.
Листинг с комментариями приведен ниже.
public static void GenerateWordDocument(Stream doc, string documentContentText)
{
 //Создаем Wordprocessing документ 
 using (WordprocessingDocument myDoc = WordprocessingDocument.Create(doc, WordprocessingDocumentType.Document))
 {
  //Добавляем новую главную часть документа - main document part
  MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
  mainPart.Document = new Document();
  //Создаем тело документа - Body (этот элемент содержит
  //другие элементы, которые мы хотим добавить в документ) 
  Body body = new Body();
  //Создаем параграф 
  Paragraph paragraph = new Paragraph();
  Run run_paragraph = new Run();
  //Размещаем текст в документе 
  Text text_paragraph = new Text(documentContentText);
  run_paragraph.Append(text_paragraph);
  paragraph.Append(run_paragraph);
  body.Append(paragraph);
  mainPart.Document.Append(body);
  //Сохраняем изменения в главной части документа 
  mainPart.Document.Save();
 }
}

Генерация файла формата MS Excel 2007/2010

Для генерации различных отчетов в виде файлов MS Excel я часто использую библиотеку EEPlus из проекта EPPlus-Create advanced Excel 2007 spreadsheets on the server
С помощью этой библиотеки метод, позволяющий сгенерировать Excel файл, содержащий ячейку с текстом, умещается в несколько строк (сравните для примера с описанием генерации c применением "чистого" Open XML SDK 2.0 на msdn). 
Листинг с комментариями приведен ниже.
public static void GenerateExcelDocument(Stream doc, string documentContentText)
{
 using (var xls = new ExcelPackage(doc))
 {
  //Добавляем лист в книгу Excel
  var worksheet = xls.Workbook.Worksheets.Add("Worksheets1");
  //Задаем ширину первого столбца
  worksheet.Column(1).Width = 30;
  //Указываем содержимое первой ячейки в первом столбце
  worksheet.Cells[1, 1].Value = documentContentText;
  //Добавляем метаданные к файлу
  xls.Workbook.Properties.Title = "Excel2010";
  xls.Workbook.Properties.Author = "UploadDocs2Lib";
  xls.Save();
 }
}
Если требуется вставить автофильтр в Excel файл, то нужно явно применить его ко всему листу: worksheet.Cells[worksheet.Dimension.Address].AutoFilter=true;

Написание приложения для генерации файлов

Все исходные коды приложения опубликованы на https://github.com/eof151/SPUploadDocs2Lib.

Создадим новое WinForms приложение, я назвал его  - SPUploadDocs2Lib.
Структура итогового проекта изображена на рисунке ниже. Не забываем добавить референсы на библиотеки DocumentFormat.OpenXml и EEPlus.
Рисунок 1.
Два вышеприведенных метода я объединил в файле с одноименным классом DocumentBuilder.cs
Для генерации файлов определенного типа уже непосредственно в определенной библиотеке документов SharePoint  я написал общий метод, код которого приведен в листинге ниже.
private void GenerateFile(SPList myList, bool isWord)
{
 SPListItem item = null;
 string documentName = "";
 MemoryStream docStream = new MemoryStream();
 StreamWriter writer = new StreamWriter(docStream);

 if (isWord) //Word
 {
  //Генерируем случайное имя файла, используя префикс и соответствующее расширение
  documentName = GeneratePartFileName(tbFilenamePref.Text, WORDFILE);
  DocumentBuilder.GenerateWordDocument(docStream, tbWordText.Text);
 }
 else //Excel
 {
  documentName = GeneratePartFileName(tbExcFilenamePref.Text, EXCELFILE);
  DocumentBuilder.GenerateExcelDocument(docStream, tbExcelText.Text);
 }

 SPFile file = myList.RootFolder.Files.Add(documentName, docStream, true);
 writer.Flush();
 item = file.Item;
 //Заполняем свойство - Название
 item["Title"] = "TestFile" + item.ID;
 item.Update();
}
Вид окна программы приведен на рисунке ниже.

Рисунок 2.

Результат работы программы

После запуска в окне программы необходимо указать URL-адрес сайта и название библиотеки документов, в которой планируется сгенерировать файлы. После этого остается указать число создаваемых файлов их префиксы и текст содержимого. 
Нажимаем на соответствующие кнопки с иконками MS Word или MS Excel и смотрим на результат:

Рисунок 3. Результат работы программы в SharePoint 2010


Рисунок 4. Результат работы программы в SharePoint 2013

Пример содержимого в сгенерированных файлах MS Office приведен на рисунках ниже.

Рисунок 5. Содержимое сгенерированного файла MS Word


Рисунок 6. Содержимое сгенерированного файла MS Excel

Подведем итоги

Как вы успели заметить, посредством небольшого количества кода и Open XML SDK 2.0 for Microsoft Office можно просто генерировать множество файлов MS Office в библиотеках документов SharePoint.

Полезные ссылки

  1. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 1 of 3)
  2. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 2 of 3)
  3. Creating Documents by Using the Open XML Format SDK Version 2.0 CTP (Part 3 of 3)
  4. How to: Create a word processing document by providing a file name (Open XML SDK)
  5. Creation of a Word 2007 document using the Open XML Format SDK

вторник, 10 сентября 2013 г.

Работа с SharePoint 2010 Client Side Object Model через Javascript

Про SharePoint 2010 Client Side Object Model (CSOM)  уже написано и съедено немало.
Я лишь постараюсь каснуться вопроса применения Javascript для работы с CSOM на ASPX-странице, расположенной в библиотеке на портале SharePoint (Site page).

Создание новой aspx-страницы в SharePoint Designer 2010

Для начала нам потребуется создать пустую aspx-страницу без мастерпейджа. Для этого открываем SharePoint Designer 2010, выбираем нужную библиотеку, в которой наша страница будет расположена (например "Страницы сайта), и через ленту добавляем новую страницу, как показано на рисунке ниже. Отмечу, что страница уже будет содержать минимальную html-разметку.

Дополнительная разметка

В начало страницы нам также нужно добавить секции Import и Register:

<%@ Import Namespace="Microsoft.SharePoint" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>      
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>      

Минимальный набор js-файлов для работы с CSOM

В заголовок страницы нужно добавить самый главный файл - "core.js":
 
<SharePoint:ScriptLink ID="ScriptLink1" Language="javascript" Name="core.js" OnDemand="true" runat="server"/>

Далее в заголовок добавляем ссылки на остальные js-файлы для корректной работы CSOM:
 

<script type="text/javascript" src="/_layouts/MicrosoftAjax.js"></script>
<script type="text/javascript" src="/_layouts/sp.core.debug.js"></script>
<script type="text/javascript" src="/_layouts/sp.runtime.debug.js"></script>
<script type="text/javascript" src="/_layouts/sp.debug.js"></script>


Напишем простой метод, в котором реализуем отображение логина текущего пользователя.
 
    <script type="text/javascript">
        var currentUser;
        function getWebProperties() {
            var userContext1 = new SP.ClientContext.get_current();
            currentUser = userContext1.get_web().get_currentUser();
            userContext1.load(currentUser);
            userContext1.executeQueryAsync(Function.createDelegate(this, this.onSuccess),
            Function.createDelegate(this, this.onFail));
        }
        function onSuccess(sender, args) {
            alert('current user: ' + currentUser.get_loginName().toLowerCase());
        }
        function onFail(sender, args) {
            alert('failed to current user. Error: ' + args.get_message());
        }
    </script>

В итоге исходный код страницы принимает вид:

Результат

После сохранения страницы открываем её в веб-браузере и видим пустую страницу с кнопкой "Get user".
Нажимаем на кнопку и видим сообщение, отображающее логин текущего пользователя!

Пример страницы можно загрузить отсюда.

Полезные ссылки