Рубрики
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