zoukankan      html  css  js  c++  java
  • Custom Ribbon in SharePoint 2010 & which not wrok when migrate from 2010 to 2013

    博客地址 http://blog.csdn.net/foxdave

    1. First of all, let me show you the ribbon modal in our project whcih just like the example from internet.

    >>SPMIPRibbon.cs

    I've add some clear comments.

    using System.Collections.Generic;
    using System.Reflection;
    using System.Web.UI;
    using System.Xml;
    using Microsoft.SharePoint.WebControls;
    
    namespace Common
    {
        public class SPMIPRibbon
        {
            //Ribbon definition template
            private const string contextualTabTemplate = "
    <GroupTemplate Id="Ribbon.Templates.Flexible2">" +
                                                                                                "
    <Layout Title="LargeLarge">" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o1" DisplayMode="Large"/>" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o2" DisplayMode="Large"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="LargeMedium">" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o1" DisplayMode="Large"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Medium"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="LargeSmall">" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o1" DisplayMode="Large"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Small"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="MediumLarge">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Medium"/>" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o2" DisplayMode="Large"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="MediumMedium">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Medium"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Medium"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="MediumSmall">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Medium"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Small"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="SmallLarge">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Small"/>" +
                                                                                                "
    <OverflowSection Type="OneRow" TemplateAlias="o2" DisplayMode="Large"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="SmallMedium">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Small"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Medium"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="SmallSmall">" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o1" DisplayMode="Small"/>" +
                                                                                                "
    <OverflowSection Type="ThreeRow" TemplateAlias="o2" DisplayMode="Small"/>" +
                                                                                                "
    </Layout>" +
                                                                                                "
    <Layout Title="Popup" LayoutTitle="LargeMedium" />" +
                                                                                                "
    </GroupTemplate>";
    
            /// <summary>
            /// Add Ribbon UI Method
            /// </summary>
            /// <param name="page">current control</param>
            /// <param name="tab">ribbon definition</param>
            /// <param name="tabID">ribbon tab id</param>
            /// <param name="isAvailable">is available</param>
            private static void AddRibbonTab(Page page, string tab, string tabID, bool isAvailable)
            {
                SPRibbon current = SPRibbon.GetCurrent(page);
                if (current != null)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(tab);
                    current.RegisterDataExtension(doc.FirstChild, "Ribbon.Tabs._children");
                    doc.LoadXml(contextualTabTemplate);
                    current.RegisterDataExtension(doc.FirstChild, "Ribbon.Templates._children");
                    current.Minimized = false;
                    current.CommandUIVisible = true;
                    if (!current.IsTabAvailable(tabID))
                    {
                        current.MakeTabAvailable(tabID);
                    }
                    if (isAvailable)
                    {
                        current.InitialTabId = tabID;
                    }
                }
            }
    
            /// <summary>
            /// Add Ribbon Event Method
            /// </summary>
            /// <param name="page">current control</param>
            /// <param name="cmds">event detail</param>
            private static void AddTabEvents(Page page, List<IRibbonCommand> cmds)
            {
                SPRibbonScriptManager manager = new SPRibbonScriptManager();
                typeof(SPRibbonScriptManager).GetMethod("RegisterInitializeFunction", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(manager, new object[] { page, "InitPageComponent", "/_layouts/SCRIPTS/SPMIPRibbon.js", false, "SPMIPRibbon.PageComponent.initialize()" });
                manager.RegisterGetCommandsFunction(page, "getGlobalCommands", cmds);
                manager.RegisterCommandEnabledFunction(page, "commandEnabled", cmds);
                manager.RegisterHandleCommandFunction(page, "handleCommand", cmds);
            }
    
            /// <summary>
            /// Set Ribbon Method
            /// </summary>
            /// <param name="page">current control</param>
            /// <param name="tab">ribbon definition</param>
            /// <param name="tabID">ribbon tab id</param>
            /// <param name="cmds">event detail</param>
            /// <param name="isAvailable">is available</param>
            public static void Set(Page page, string tab, string tabID, List<IRibbonCommand> cmds, bool isAvailable)
            {
                AddRibbonTab(page, tab, tabID, isAvailable);
                AddTabEvents(page, cmds);
            }
        }
    }


    >>SPMIPRibbon.js

    Ribbon command javascript file

    function ULS_SP() {
        if (ULS_SP.caller) {
            ULS_SP.caller.ULSTeamName = "Windows SharePoint Services 4";
            ULS_SP.caller.ULSFileName = "SPMIPRibbon.js";
        }
    }
    
    Type.registerNamespace('SPMIPRibbon');
    
    SPMIPRibbon.PageComponent = function () {
        ULS_SP();
        SPMIPRibbon.PageComponent.initializeBase(this);
    }
    
    SPMIPRibbon.PageComponent.initialize = function () {
        ULS_SP();
        ExecuteOrDelayUntilScriptLoaded(Function.createDelegate(null, SPMIPRibbon.PageComponent.initializePageComponent), 'SP.Ribbon.js');
    }
    
    SPMIPRibbon.PageComponent.initializePageComponent = function () {
        ULS_SP();
        var ribbonPageManager = SP.Ribbon.PageManager.get_instance();
        if (null !== ribbonPageManager) {
            ribbonPageManager.addPageComponent(SPMIPRibbon.PageComponent.instance);
            ribbonPageManager.get_focusManager().requestFocusForComponent(SPMIPRibbon.PageComponent.instance);
        }
    }
    
    SPMIPRibbon.PageComponent.refreshRibbonStatus = function () {
        SP.Ribbon.PageManager.get_instance().get_commandDispatcher().executeCommand(Commands.CommandIds.ApplicationStateChanged, null);
    }
    
    SPMIPRibbon.PageComponent.prototype = {
        getFocusedCommands: function () {
            ULS_SP();
            return [];
        },
        getGlobalCommands: function () {
            ULS_SP();
            return getGlobalCommands();
        },
        isFocusable: function () {
            ULS_SP();
            return true;
        },
        receiveFocus: function () {
            ULS_SP();
            return true;
        },
        yieldFocus: function () {
            ULS_SP();
            return true;
        },
        canHandleCommand: function (commandId) {
            ULS_SP();
            return commandEnabled(commandId);
        },
        handleCommand: function (commandId, properties, sequence) {
            ULS_SP();
            return handleCommand(commandId, properties, sequence);
        }
    }
    SPMIPRibbon.PageComponent.registerClass('SPMIPRibbon.PageComponent', CUI.Page.PageComponent);
    SPMIPRibbon.PageComponent.instance = new SPMIPRibbon.PageComponent();
    NotifyScriptLoadedAndExecuteWaitingJobs("SPMIPRibbon.js");


    Now let us see how to use it

    Declare a ribbon definition like this as below

    private string ribbonTab = @"
              <Tab Id=""SPMIPRibbon.Tab1"" Sequence=""400"" Description="""" Title=""清单采购一览"">
                <Scaling Id=""SPMIPRibbon.Scaling1"">
                  <MaxSize Id=""SPMIPRibbon.MaxSize1"" Sequence=""10"" GroupId=""SPMIPRibbon.Group1"" Size=""LargeLarge""/>
                  <Scale Id=""SPMIPRibbon.Scale1"" Sequence=""20"" GroupId=""SPMIPRibbon.Group1"" Size=""Popup"" />
                </Scaling>
                <Groups Id=""SPMIPRibbon.Groups1"">
                  <Group Id=""SPMIPRibbon.Group1""
                         Sequence=""10"" 
                         Description=""""
                         Title=""操作区""
                         Image32by32Popup=""/_layouts/2052/images/formatmap32x32.png"" Image32by32PopupTop=""-416"" Image32by32PopupLeft=""-256""
                         Template=""Ribbon.Templates.Flexible2"" >
                    <Controls Id=""SPMIPRibbon.Controls1"">
                    <Button
                        Id=""SPMIPRibbon.Button2""
                        Sequence=""20""
                        Command=""SPMIPRibbon.Command2""
                        Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-128"" Image32by32Left=""-96""
                        LabelText=""编辑""
                        ToolTipTitle=""编辑采购清单""
                        ToolTipDescription=""编辑采购清单""
                        TemplateAlias=""o1""/>
                    <Button
                        Id=""SPMIPRibbon.Button4""
                        Sequence=""30""
                        Command=""SPMIPRibbon.Command4""
                        Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-160"" Image32by32Left=""-416""
                        LabelText=""确认招标""
                        ToolTipTitle=""确认招标采购清单""
                        ToolTipDescription=""确认招标采购清单""
                        TemplateAlias=""o1""/>
                    <Button
                        Id=""SPMIPRibbon.Button5""
                        Sequence=""30""
                        Command=""SPMIPRibbon.Command5""
                        Image32by32=""/_layouts/2052/images/formatmap32x32.png"" Image32by32Top=""-320"" Image32by32Left=""-224""
                        LabelText=""上传附件""
                        ToolTipTitle=""上传采购清单附件""
                        ToolTipDescription=""上传采购清单附件""
                        TemplateAlias=""o1""/>
                    </Controls>
                  </Group>
                </Groups>
              </Tab>";


    Override OnPreRender method and add the following code

    var cmds = new System.Collections.Generic.List<IRibbonCommand>();
                cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command2", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Chuang_jzh', Edit);", "CheckEditEnabled();"));
                cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command5", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Chuang_jzh', Upload);", "CheckEditEnabled();"));
                cmds.Add(new SPRibbonCommand("SPMIPRibbon.Command4", "gdv.GetSelectedFieldValues('ID;Qing_dlx;Que_rzhb;Chuang_jzh', Confrim);", "CheckEditEnabled();"));
                SPMIPRibbon.Set(Page, ribbonTab, "SPMIPRibbon.Tab1", cmds, true);


    Enjoy it.

     

    Here is one problem when we migrate it from SP14 to SP15, we may get error message as "getGlobalCommands not found".

    The reason is in SharePoint 2013, the SPRibbonScriptManager class's execution is slower than the js execution, when the js object initializes, the needed commands have not generated.

    To solve this, we need to do a little change to the js file.

    Change the

    ExecuteOrDelayUntilScriptLoaded(Function.createDelegate(null, SPMIPRibbon.PageComponent.initializePageComponent), 'SP.Ribbon.js');

    to

    _spBodyOnLoadFunctionNames.push("SPMIPRibbon.PageComponent.initializePageComponent");

    That is all, thanks.

  • 相关阅读:
    day19 Pyhton学习 递归函数
    python程序整理(2)
    python程序整理(1)
    day18 Pyhton学习 内置函数最后七个
    day18 Pyhton学习 匿名函数
    day17 Pyhton学习 内置函数继续
    二分法查找
    day16 Pyhton学习
    python从入门到精通之30天快速学python视频教程
    零基础快速掌握Python系统管理视频课程【猎豹网校】
  • 原文地址:https://www.cnblogs.com/justinliu/p/5961687.html
Copyright © 2011-2022 走看看