Кнопки в Риббоне (Ribbon) и меню

Добавление кнопок в Риббон и меню

Добавление функционала в Риббон начинается с добавления в проект "Пустого элемента"



 Добавим в файл элемента следующий текст и попробуем понять принцип на его примере.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction Id="CalendarAction" Location="CommandUI.Ribbon" RegistrationId="106" RegistrationType="List">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition Location="Ribbon.Calendar.Calendar.Actions.Controls._children">
          <Button Id="btExportToExcel" Command="ExportToExcel" Description="Экспорт календаря в Excel"
                  LabelText="Экспорт в Excel" TemplateAlias="o1" Sequence="50"
                  ToolTipTitle="Экспорт в Excel" ToolTipDescription="Экспорт событий из календаря в документ Excel"
                  Image32by32="/_layouts/images/x32.png"
                  Image16by16="/_layouts/images/x16.png"/>
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler Command="ExportToExcel" CommandAction="javascript:LoadReport();" />
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
  <CustomAction Id="" Location="ScriptLink" ScriptBlock="
                function LoadReport()
                {
                  var listId = SP.ListOperation.Selection.getSelectedList();
                  var siteUrl = _spPageContextInfo.siteServerRelativeUrl;
                  var webUrl = _spPageContextInfo.webServerRelativeUrl;
                  var isRootWeb = siteUrl == webUrl;
                  if(isRootWeb)
                  {
                     window.open('/_layouts/CalendarReportHandler.aspx?listId=' + listId, '_blank');
                  }
                  else{
                    window.open(webUrl + '/_layouts/CalendarReportHandler.aspx?listId=' + listId, '_blank');                
                  }
                }
                "/>
</Elements>

а) Идентификаторы (id) всех объектов должны быть уникальны (как минимум в рамках одной страницы), можно туда вставлять GUID, созданный специальными утилитами
б) Локация (Location) показывает в иерархии, где должен находиться объект.  В нашем случаи мы размещаем кнопку во вкладу "Календарь", группа "Подключение и экспорт". Более подробно можно глянуть здесь и здесь.
в) RegistrationType указывает тип объекта, к которому применим этот объект.  В нашем случаи  - это список.
г) RegistrationId  указывает код (идентификатор) объекта, к которому применим этот объект. В нашем случаи говорится, что это должен быть календарь.
д) CommandAction указывает функцию (скрипт), которая будет отрабатывать по событию нажатия на кнопку.
е) Здесь же ниже описана функция события нажатия на кнопку. Хотя это можно сделать любым другим способом, главное чтобы этот скрипт был доступен на необходимой странице, т.е. там где будет доступна наша кнопка. В нашем примере скрипт открывает страницу, предавая ей параметры в адресной строке.



P.S. Для тех. кто умеет пользоваться средствами отладки браузеров (клавишаF12) могут легко вычислить  место в иерархии где надо вставлять объекты, находя идентификаторы соседних или материнских объектов




Рассмотри ещё один пример и опишем отличие от предыдущего


<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction ShowInLists="True" Id="Ribbon.ListItem.CustomGroup"  RegistrationType="List" RegistrationId="100"Location="CommandUI.Ribbon" Rights="EditListItems" >
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition  Location="Ribbon.ListItem.Groups._children">
          <Group Id="Ribbon.ListItem.CustomGroup" Sequence="55"   Description="Функции взаимодействия"  Title="Данные"  Command="EnableCustomGroup"     Template="Ribbon.Templates.Flexible2">
            <Controls Id="Ribbon.ListItem.CustomGroup.Controls">
              <Button  Id="Ribbon.ListItem.CustomGroup.ImportContractParties" Alt="Загрузить контрагентов" Sequence="0"
                       Image32by32="/_layouts/images/ACTIONSEDITPAGE.PNG" Command="Import"  LabelText="Загрузить контрагентов"TemplateAlias="o1"/>
            </Controls>
          </Group>
        </CommandUIDefinition>
        <CommandUIDefinition  Location="Ribbon.ListItem.Scaling._children">
          <MaxSize    Id="Ribbon.ListItem.Scaling.CustomGroup.MaxSize" Sequence="15" GroupId="Ribbon.ListItem.CustomGroup"Size="LargeLarge" />
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler Command="EnableCustomGroup" CommandAction="javascript:return true;" />
        <CommandUIHandler Command="Import" CommandAction="javascript:Load();" EnabledScript="javascript:enbl();" />
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
  <CustomAction Id="Ribbon.Library.Actions.NewButton.Script" Location="ScriptLink" ScriptBlock="
                function Load()
                {
                  alert('ok');
                }
                 function enbl()
                {
                  return true;
                }
                "/>
</Elements>


a) Здесь мы создаём свою отдельную группу "Данные". Группа добавляется во вкладку "Элементы" настраиваемого списка.
б) Свойство "Rights" устанавливает видимость (доступность) в зависимости от прав на список.
в) EnabledScript динамически вычисляет доступность команды в тех или иных ситуациях



И на последок просто пример утверждения элементов списка, через кнопки в Риббоне.



<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction ShowInLists="TRUE" Id="{F769FFE5-8588-46FB-B166-92ED081BCA16}" RegistrationType="List" RegistrationId="22200" Location="CommandUI.Ribbon" Rights="EditListItems" >
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition  Location="Ribbon.ListItem.Actions.Controls._children">
          <Button  Id="Ribbon.ListItem.Actions.Approve" Alt="Утвердить" Sequence="10" Image32by32="/_layouts/images/ACTIONSEDITPAGE.PNG" Command="{CAB77770-50E9-4273-A83D-62E3CE3F0ED8}" LabelText="Утвердить" TemplateAlias="o2"/>
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler Command="{CAB77770-50E9-4273-A83D-62E3CE3F0ED8}" CommandAction="javascript:SetStatus('Утверждено',2);"  EnabledScript="javascript: enbl();"/>
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>


  <CustomAction Id="Ribbon.Library.Actions.NewButton.Script"
    Location="ScriptLink"
    ScriptBlock="
                function SetStatus(value, result)
                {
                  var context = SP.ClientContext.get_current();
                  var items = SP.ListOperation.Selection.getSelectedItems(context);
                  var listId = SP.ListOperation.Selection.getSelectedList();
                  var curlist = context.get_web().get_lists().getById(listId);
                  var listItem = curlist.getItemById(items[0].id);
                  listItem.set_item('ApprStatus',value);
                  listItem.set_item('AuxField',result);
                  listItem.update();
                  SP.UI.Notify.addNotification('Попытка установить статус');
                  var onSuccess = function (sender, args) { SP.UI.Notify.addNotification('Статус установлен'); SP.UI.ModalDialog.RefreshPage(1); };
                  var onFail = function (sender, args) { SP.UI.Notify.addNotification('Ошибка: ' + args.get_message()); };
                  context.executeQueryAsync(onSuccess, onFail);
                }
             
                function enbl()
                { //Дополнительно убрать активность при статусе отличным от 'Нет статуса'
                  var context = SP.ClientContext.get_current();
                  var selection = SP.ListOperation.Selection.getSelectedItems(context);

                  if (CountDictionary(selection) == 1){return true;}
                  else {return false;}
                }
             
    var isEnbl;
   
    function enbl2()
                {
                  isEnbl = false;
                  var context = SP.ClientContext.get_current();
                  var items = SP.ListOperation.Selection.getSelectedItems(context);

                  if (CountDictionary(items) == 1){
                    isEnbl =  true;
                    var listId = SP.ListOperation.Selection.getSelectedList();
                    var curlist = context.get_web().get_lists().getById(listId);
                    var listItem = curlist.getItemById(items[0].id);
                    var onSuccess = function (sender, args) {
                      var status = listItem.get_item('ApprStatus');
                      if (status == 'Нет статуса'){
                        isEnbl =  true;}
                      else {
                        isEnbl =  false;}
                    //  RefreshCommandUI();
                    };
                    var onFail = function (sender, args) { alert(args.get_message()); isEnbl =  false; };
                    context.load(listItem,'ApprStatus');
                    context.executeQueryAsync(isEnable = onSuccess, onFail);
                  }
                  else {isEnbl = false;}
               
                  return isEnbl
                }
   
                "/>

  <CustomAction ShowInLists="TRUE" Id="{B2B056C0-5DC2-4F25-80E7-4CB806B0120A}" RegistrationType="List" RegistrationId="22200" Location="CommandUI.Ribbon">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition  Location="Ribbon.ListItem.Actions.Controls._children">
          <Button  Id="Ribbon.ListItem.Actions.NoApprove" Alt="Отклонить" Sequence="10" Image32by32="/_layouts/images/ACTIONSEDITPAGE.PNG" Command="{42A36EA9-766B-433C-A767-FF92BEE78E20}" LabelText="Отклонить" TemplateAlias="o2"/>
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler Command="{42A36EA9-766B-433C-A767-FF92BEE78E20}" CommandAction="javascript:SetStatus('Отклонено',3)" EnabledScript="javascript: enbl();"/>
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>
</Elements>

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

Яндекс.Метрика