Динамическое добавление плитки на SAP Fiori Launchpad
Некоторое время назад я рассматривал вариант добавления плитки на SAP Fiori Launchpad
См. заметку Как добавить плитку в SAP Fiori Launchpad?
В этой заметке я хочу рассмотреть вариант реализации, который может быть использован для случаев, когда заказчику требуется динамически добавлять плитку на ланчпад пользователя. То есть в результате выполнения какого-то условия.
Что мне для этого понадобится?
Плагин для ланчпада
См. Создание плагина для SAP Fiori Launchpad
OData сервис, посредством которого я буду определять необходимость добавления плитки на ланчпад
См. заметку Создание Web приложения с помощью фреймворка SAPUI5 (6)
Класс sap.ushell.services.Bookmark
См. class sap.ushell.services.Bookmark
Задача
Добавить для пользователя плитку на SAP Fiori Launchpad при условии, что ему присвоена определенная роль в backend системе. Новая плитка может быть добавлена на ланчпад без привязки к определенному каталогу плиток, который наличествует у пользователя.
OData сервис для получения информации о наличии роли пользователя
OData сервис, который я планирую использовать для получения информации о наличии роли у пользователя, имеет EntitySet со следующими свойствами
См. Create Entity Sets
Заполнение требуемого EntitySet'а выполняется в *DPC_EXT классе OData-сервиса.
См. Extending an OData Service Using Service Builder
Например,
METHOD roleexist_get_entityset.
DATA: ls_entity_set LIKE LINE OF et_entityset.
LOOP AT it_filter_select_options ASSIGNING FIELD-SYMBOL(<fs_filt>).
CASE <fs_filt>-property.
WHEN 'roleName'.
DATA(lv_carrid) = <fs_filt>-select_options.
LOOP AT <fs_filt>-select_options ASSIGNING FIELD-SYMBOL(<fs_options>).
DATA(lv_role_from_front) = <fs_options>-low.
ENDLOOP.
ENDCASE.
ENDLOOP.
IF lv_role_from_front IS NOT INITIAL.
SELECT SINGLE agr_name INTO @DATA(lv_agr_name) FROM agr_users WHERE uname = @sy-uname AND agr_name EQ @lv_role_from_front AND to_dat EQ '99991231'.
IF lv_agr_name IS NOT INITIAL.
APPEND VALUE #(
roleid = lv_role_from_front
isexists = abap_true
rolename = get_role_name( lv_agr_name )
) TO et_entityset.
ELSE.
APPEND VALUE #(
roleid = '-'
isexists = '-'
rolename = '-'
) TO et_entityset.
ENDIF.
ELSE.
APPEND VALUE #(
roleid = '-'
isexists = '-'
rolename = '-'
) TO et_entityset.
ENDIF.
ENDMETHOD.
Наполнение плагина для SAP Fiori Launchpad
Привожу пример реализации функции onInit()
См. SAP Fiori Launchpad Extensibility
init: function() {
var oBookmarkService = sap.ushell.Container.getService("Bookmark");
var sUrl = "/sap/opu/odata/SAP/ZAPP14_SRV_01";
var oDataModel = new sap.ui.model.odata.v2.ODataModel(sUrl, {
json: true
});
var oFilters = [new sap.ui.model.Filter("roleName", "EQ", "ZDEVELOPER")];
oDataModel.read(\'/roleExist\', {
filters: oFilters,
success: function(oData, response) {
var oFlpModel = new sap.ui.model.json.JSONModel({});
oFlpModel.setData(oData.results);
sap.ui.getCore().setModel(oFlpModel, "oFlpMdl");
},
error: function(oError) {}
});
oDataModel.attachBatchRequestCompleted(function(oData) {
var oRole = sap.ui.getCore().getModel("oFlpMdl").getData(oData);
if (oRole[0].isExists === "X") {
oBookmarkService.countBookmarks("#ZBOOKMARK-display").done(function(iCount) {
var oRoleModel2 = new sap.ui.model.json.JSONModel({});
oRoleModel2.setData(iCount);
switch (iCount) {
case (0):
oBookmarkService.addBookmark({
title: "Application title",
url: "#ZBOOKMARK-display",
icon: "sap-icon://developer-settings",
info: "Dynamic tile loaded",
subtitle: oRole[0].roleName
});
break;
case (1):
return;
break;
case (2):
oBookmarkService.deleteBookmarks("#ZBOOKMARK-display");
break;
default:
return;
break;
}
}).fail(function(sMessage) {
});
} else {
oBookmarkService.deleteBookmarks("#ZBOOKMARK-display");
}
});
}
Настройка Target Mapping для добавляемой плитки
Чтобы приложение можно было запустить по клику на добавленную плитку, требуется настроить Target Mapping (Присвоение цели) в одном из каталогов, присутствующих у пользователя.
См. Configuring Navigation
См. Configuring Target Mappings
Тестирование
Спасибо за ваше время. Зима будет долгой, но все по-прежнему обойдется. Обнимаю. ignatov