当前位置: 首页 > Web前端 > HTML

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

时间:2023-03-28 15:13:18 HTML

SAPFiori应用AdaptUI动态显示或隐藏的技术设计细节分析否?FioriKeyUser通过点击该按钮进入FioriUI的Adaptation模式,从而实现在屏幕上添加扩展字段的目的。对比一下下面两个不同系统的截图:为什么AdaptUI按钮那么难找,有的系统有,有的系统没有?不需要任何人的帮助就可以舒适地生活。假设你身边找不到SAPFiori专家,你如何通过自己在系统中调试来找到问题的答案呢?本篇我们通过单步调试的方式来分析AdaptUI按钮是否动态显示的逻辑。首先,根据笔者之前介绍的SAPUI5控件在浏览器端的渲染逻辑的知识,我们找到了一个ID为sap.ushell.plugins.rta的插件,它负责管理调整UI按钮。我个人理解rta是RunTimeAdaptation的缩写。这个插件从哪里来的?在Chrome开发者工具中,我全文搜索了sap.ushell.config和sap-ushell-config的关键词,找到了如下代码片段:可以看出rta插件实例存放在sap-ushell-config在全局对象的bootstrapPlugins属性中。在可以显示AdaptUI按钮的系统上调试,发现全局对象sap-ushell-config的值来自JSON对象oServerSideConfig,后者的值是从html中硬编码的字符串反序列化而来SAPFioriLaunchpadTransformation的页面:复制FioriLaunchpad.html中硬编码的字符串:解码后发现其层级结构与我们在Chrome开发者工具中观察到的sap-ushell-config全局对象完全一致,说明我们正在寻找合适的地方。下一步是找出FioriLaunchpad.html中这个硬编码字符串的来源。标准开发人员逐字符输入?SAP软件并不那么愚蠢。SE80打开FioriLaunchpadShell对应的BSP应用:/ui2/ushell,发现字符串的值来自变量:${SERVER-SIDE-CONFIG},所以我们在SE80中找到的FioriLaunchpad.html只是一个模板文件。第76行出现的${SERVER-SIDE-CONFIG}只是一个占位符,运行时会被变量的实际值代替,最后变成我们在Chrome开发者工具中观察到的长字符串String。那么变量${SERVER-SIDE-CONFIG}的值从何而来呢?在BSP应用中搜索,发现变量中注入了get_server_side_config_json方法返回的值。所以现在的问题是通过get_server_side_config_json方法单步搞清楚里面的逻辑:当我单步进入这个方法的时候,发现上面第18行的内表lr_data->mt_plugin已经包含了需要返回和注入的信息在变量${SERVER-SIDE-CONFIG}中列出了当前系统上所有可用的FioriLaunchpad插件实例,本文关注的sap.rta.plugin也列出来了。那么为什么在本文开头提到的其他系统中没有显示AdaptUI按钮呢?问题出在下图中第22行的CHECK语句。第18行的mt_plugin内表存储了当前系统可用的所有FioriLaunchpad插件,每个插件对应一个目录ID。第21行的内部表it_catalogs存储当前登录用户拥有的PFCG角色。目录ID的集合。上面代码的语义是遍历当前系统可用的所有FioriLaunchpad插件。如果相应的目录ID没有出现在登录用户拥有的目录ID集合中,则该插件对该登录用户无效。(无效),应将其隐藏在FioriLaunchpad中。从上图调试窗口得知RunTimeAdaptation插件对应的目录ID为/UIF/SAP_RTA_PLUGIN,然后去ABAP后台SU01查看,发现在系统中看不到AdaptUI按钮,myuser果然没有分配这个目录。于是分配:问题解决了,现在在FioriUI中,久违的AdaptUI又回来了。这是一个“自己动手,丰衣足食”的实际例子——通过单步调试,在不求助于Fiori专家的情况下,也解决了工作中遇到的实际问题。对FioriAdaptUI更多技术细节感兴趣的朋友不妨继续阅读。为了让KeyUser在运行时使用AdaptUI按钮来适配SAPFiori应用程序,这个Fiori应用程序中的所有控件都必须有一个Stableid。只有当AdaptUI的逻辑在运行时使用Stableid时,才能确保KeyUser所做的适配可以再次重新应用,例如在Fiori应用程序更新后。稳定的ID用于在运行时识别和修改控制器内的控件。但是,如果视图被重用或嵌套,则ID不再是唯一的。为避免歧义,每个视图都为所有子控件添加了自己的ID作为前缀。如果ID是在控件实例化期间创建的,则默认情况下它是唯一的。如果在运行时创建了一个新控件,控制器将通过调用oController.createId("ID")方法创建一个唯一的ID。这些方法可以为ID添加必要的前缀。另一方面,不建议关键用户直接在生产系统中调整UI,因为直接在生产系统中进行的UI调整可能会干扰转移的更改。小结本文首先从笔者工作过程中经常被同事问到的一个问题入手,然后详细介绍笔者是如何通过单步调试分析出SAPFioriAdaptUI按钮是否显示的设计逻辑。通过这个例子再次阐述了SAP系统的权限管控的设计思路。