Скрыть риббон от пользователей и показать админам в SharePoint 2013 Design Manager

В SharePoint 2010 существовал серверный контрол SPSecurityTrimmedControl, который можно было использовать на masterpage для скрытия риббона, например, или других частей страницы. В SharePoint 2013 он никуда не делся, но скрыть риббон, редактируя страницу через Design Manager стало не так просто. Причина в том, что, во-первых, изменилась вёрстка, а во-вторых через сниппеты это делается чуть сложней… :)

Моя идея в том, чтобы скрыть риббон CSS-классом, а показавать его Javascript’ом, который будет выполняться только для админа. К сожалению, добавить CSS для админа через сниппет Design Manager’а у меня не получилось, некоторые символы «съедаются» при конвертации страницы в aspx.

Итак,
1. Скрываем риббон классом

#ms-designer-ribbon { display: none; }

2. Добавляем на Html Master Page код перед закрывающим тегом </body> (показываем риббон для админов):

<div data-name="SecurityTrimmedFullMask">
		    <!--CS: Start Security Trim Snippet-->
		    <!--SPM:<%@Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>-->
		    <!--MS:<SharePoint:SPSecurityTrimmedControl runat="server" Permissions="FullMask ">-->
		        <!--PS: Start of READ-ONLY PREVIEW (do not modify)--><span><!--PE: End of READ-ONLY PREVIEW-->
		        
				<script type="text/javascript">//<![CDATA[
				var ribbonDiv = document.getElementById("ms-designer-ribbon");
				ribbonDiv.setAttribute("style", "display: inline; position: static;");
				//]]></script>
		        
		        <!--PS: Start of READ-ONLY PREVIEW (do not modify)--></span><!--PE: End of READ-ONLY PREVIEW-->
		    <!--ME:</SharePoint:SPSecurityTrimmedControl>-->
		    <!--CE: End Security Trim Snippet-->
		</div>

Permissions="FullMask" указывает для пользователей с какими ролями показать участок кода внутри.

Важно прописать строку Register Tagprefix="SharePoint" прямо перед самим использованием тега SharePoint:SPSecurityTrimmedControl, иначе страница будет выдавать ошибку и тогда вы не только не увидите риббон, но озаботитесь поиском ошибки по Correlation Id :)

Поменьше ошибок, побольше стабильных решений, удачи!

Рубрика: SharePoint | 1 комментарий

Кнопка для установки лайка в SharePoint 2013 через JS

В SharePoint 2013 CSOM есть недокументированная возможность установить Like для любого элемента списка или библиотеки Javascript’ом.
Сама возможность лайкать включается тут: Параметры списка (List Settings) -> Параметры оценок(Rating settings).

Код для установки лайка, для тестирования я добавлял его в Content Query Web Part:

<script type="text/javascript" src="/_layouts/15/Reputation.js"></script>

<script type="text/javascript">
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', UpdateLike);

function UpdateLike() {
	var itemId = 1;
	var listId = "B79D49E4-334D-42F3-8E43-5E7CB8ABCDD0";
	var setLike = true;
	
	var ctx = new SP.ClientContext("<yourSiteUrl>");
	Microsoft.Office.Server.ReputationModel.Reputation.setLike(ctx, listId, itemId, setLike);

	ctx.executeQueryAsync(Function.createDelegate(this, this.RatingSuccess), Function.createDelegate(this, this.RatingFailure));
};
  
function RatingSuccess(sender, args) {
	alert('Rating Done Successfully');
}

function RatingFailure(sender, args) {
	alert('SetRating failed:' + args.get_message());
}
</script>

У меня не получилось подключить скрипт Reputation.js через предназначенную для этого SP.SOD.executeFunc. Поэтому я подключил его обычным тегом script. Основной код содержится в функции UpdateLike. Его можно вызывать по клику на кнопку.

Основная идея взята тут: https://coderwall.com/p/urb8kg/custom-like-button-in-sharepoint-2013

Отдельное спасибо моему коллеге Алексею за помощь в поиске решения задачи!

Рубрика: Без рубрики | Комментарии (2)

SharePoint 2013 исчезает полоса прокрутки при использовании custom MasterPage

После добавления собственного masterpage в SharePoint 2013 у меня исчезла полоса прокрутки (scrollbar).

По какой-то причине javascript SharePoint’а неверно высчитывает высоту элемента div#s4-workspace. Говорят, это связано с риббоном и добавлением собственного контента, который мешает верной работе скрипта:
https://social.msdn.microsoft.com/Forums/en-US/9422aa0f-5010-4691-a0ab-25e7aca6b478/issue-with-div-s4workspace-and-scroll-bar?forum=sharepointcustomizationprevious

Один из вариантов исправления — добавление собственного css-файла со строкой

body 
{
   overflow: scroll;
}

К сожалению, это не исправит причину ошибки.

Файл можно добавить в настройках Master page для сайта, последняя вкладка Alternate CSS URL для английской версии SharePoint.

Решение найдено тут:
https://www.linkedin.com/groups/sharePOint-2013-Scrollbar-missing-136589.S.239829403

Другое решение заключается в добавлении собственного js:
http://www.edroesch.com/2013/10/sharepoint-2013-workspace-scroll-issue-fix/

Почитать исследование проблемы можно тут:
http://blog.amtopm.be/tag/body-s4-workspace/
Для себя я пока не нашёл правильного решения проблемы, если найду, поделюсь.

Все ссылки на статьи на английском языке.

Рубрика: SharePoint | 1 комментарий

Установка .Net Framework 3.5 на Windows 8.1 без интернета с помощью DISM

Попытался установить .Net Framework 3.5 на Windows 8.1. Интернет есть, но ошибка говорит сама за себя: Windows couldn’t connect to the Internet to download necessary files. Make sure that you’re connected to the Internet, and click Retry to try again.

Выход — установить фреймворк с дистрибутива Windows командой:

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:installationMediaDrive:\sources\sxs

Где installationMediaDrive — буква диска с дистрибутивом W8.1

Рубрика: Windows | Метки: Windows couldn't connect to the Internet, установить .Net Framework 3.5 на Windows 8.1 | Добавить комментарий

Хорошая статья: WCF REST Service for SharePoint 2013

Хорошая статья на английском о том, как создать WCF REST веб-сервис для SharePoint 2013:
http://jbarkes.blogspot.ru/2014/04/sharepoint-2013-create-custom-wcf-rest.html

Могу сделать перевод, если кому-то интересно, пишите!

Рубрика: SharePoint | Добавить комментарий

Поиск SharePoint не работает — одна из возможных причин

Не в первый раз столкнулся с проблемой на разработческой машине — поиск SharePoint не работает. Эта проблема возникала в 2010, а теперь и версии 2013. Симтомы в центре администрирования в Search Service Application: Searchable items — All Errors и жёлтый восклицательный знак на панели состояния под Index Partition.

В моём случае помог сброс индекса (ссылка в левом меню в Search Service Application). Но сбросился он не сразу, сначала сброс отваливался по таймауту. Пришлось чистить кэш конфигурации сервера. Как это сделать описано здесь Can’t reset index Sharepoint 2013. Папка :\ProgramData по умолчанию скрыта в Windows.

До новых встреч!)

Рубрика: SharePoint | Добавить комментарий

SharePoint 2013 CSR Display Template для конкретного представления списка

В SharePoint 2013 появилась отличная возможность кастомизации представления списка (а ещё полей на формах и т.д.) через Display Template (более глобально — CSR).
Однажды понадобилось добавить на страницу несколько представлений списка, а кастомизировать только одно. При этом, указывая свойство JSLink у веб-части представления, Display Template применяется ко всем веб-частям, отображающим нужный список!!!

UPD: это происходит из-за того, что свойство JSLink лишь подсоединяет нужный скрипт кастомизации на страницу, но не как не определяет целевой элемент, к которому нужно применить изменения.

Привожу решение, возможно не самое красивое и возможно не единственное:
Самовыполняемая функция инициализации Display Template:

(function () {

    // Инициализируем переменные
    var overrideCtx = {};
    overrideCtx.Templates = {};

    // Инициализируем переменные статичных блоков
    overrideCtx.Templates.Header = "<div><h1>Информация</h1><table>";

    // Применяем кастомный темплейт, он в функции
    overrideCtx.Templates.Item = window.MyPartner.fieldItem.customItemHtml;
    
    overrideCtx.Templates.Footer = "</table></div>";

    //  Устанавливаем Base view ID (свойство отвечает за нужное представление списка)
    //  Устанавливаем тип шаблона списка (если список кастомный, то скорее всего цифра изменится на вашу. У стандартного списка 100)
    
    overrideCtx.BaseViewID = 1;
    overrideCtx.ListTemplateType = 10000;
    		
    // здесь можно переопределить функции OnPreRender и OnPostRender. В последней можно, например, отсортировать элементы через JS
    
    // Переопределяем функцию RenderListView после загрузки ClientTemplates.js
    
    ExecuteOrDelayUntilScriptLoaded(function () {

        //копируем текущую дефолтную реализацию RenderListView
        var oldRenderListView = RenderListView;

        //переопределяем
        RenderListView = function (ctx, webPartID) {
        
            //проверяем id списка, представление которого кастомизируем
            if (ctx.listName == "{D42FBFC7-172C-417B-8AD0-3EF9383FA055}") {
                //проверяем id предсвавления, которое кастомизируем
                if (ctx.view !== "{F8364117-DF65-4C40-B537-E60FEFB914A9}") {
                    //если представление оказалось не тем, что нам нужно, то переопределяем BaseViewID
                    //к этому представлению Display Template не применится
                    ctx.BaseViewID = 99;
                    //window.console && console.log('Set BaseViewID: 99 ' + ctx.view);
                }
            }

            //вызываем дефолтный RenderListView с изменённым контекстом ctx
            oldRenderListView(ctx, webPartID);
        }

    }, "ClientTemplates.js");
    

    // Регистрируем свою кастомизацию шаблона
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);
})();

По мотивам stackexchange:
http://sharepoint.stackexchange.com/questions/97410/jslink-for-multiple-list-views

Рубрика: SharePoint, Без рубрики | Метки: 2013, Display Template, SharePoint, предствления, разделение представлений, список | Добавить комментарий

Дату создания элемента в поиск SharePoint 2010

Чтобы отобразить дату создания элемента списка в поиске SharePoint 2010, нужно создать Managed Propery поиска (например, ItemCreated) с типом Date and Time и замапить на него поля Basic:15; Office:12; Creationdate(Date and Time).

Рубрика: SharePoint, Без рубрики | Добавить комментарий

Службе таймера не удалось инициализировать свою конфигурации. Проверьте базу данных конфигурации.

Проблема возникла второй раз, помогает чистка кэша таймера http://soerennielsen.wordpress.com/2009/01/14/fixing-the-timer-service-when-everything-breaks-down/ или http://tomblog.insomniacminds.com/2008/07/30/sharepoint-internals-clearing-configuration-cache-caveat/

P.S. Ошибку в названии (тексте ошибки) не я допустил, так написано в логах :)

Рубрика: SharePoint, Без рубрики | Метки: SharePoint, деплой, кеш, конфигурация, ошибка, таймер | Добавить комментарий

Зачем нужен закомментированный код?

int b = 5;
int a = b;

if (a != b 
/*|| b > 3*/)
{
    b = a;
}

Не думаю, что закомментированный участок прибавил красоты коду или улучшил коммуникацию.
В TFS (SVN,<что-то на ваш вкус и цвет>) есть возможность посмотреть предыдущую версию и даже сравнить с ней текущую построчно. Внимание, вопрос: зачем чекинить закомментированный код?

Рубрика: Удобный код, Это интересно | Комментарии (2)