这是Jerry2021年的第72篇文章,也是王子熙的第349篇原创文章公众号。对于基于ABAP技术栈的SAP产品,客户可以安装增强包(EnhancementPackage),为当前使用的应用程序引入新功能。EnhancementPackage(增强包),顾名思义,包含应用程序增强的集合。客户可根据企业实际业务流程,选择性启用增强包中的部分新功能。每个新功能对应一个业务功能。只有在系统中激活业务功能后,其相应的新功能,包括前台页面、后台业务程序、SPRO执行活动才会生效。借助增强包,客户无需升级Netweaver版本即可使用SAP产品的新功能。业务功能为增强包中的新功能提供了更细粒度的管理灵活性,客户可以根据自己的实际需求选择性地启用部分新功能。ABAPBusinessFunction对增强包新功能的控制,最终是通过其包含的BusinessSwitch,即业务开关来实现的。开关与我们现实生活中的开关概念一致,有On和Off两种状态。业务切换可以控制ABAP前后端代码的行为,以及后端配置表中的记录。下面通过一个实际例子来说明。SAPCRM可以通过中间件从SAPERP中下载物料主数据。SAPERP作为这个数据交换场景的源头系统,可以不断修改物料主数据的某些字段,这些修改会自动同步到CRM,这就是DeltaDownload。在实施中是不能接受的。例如,SAPERP最初以英文和中文版本维护物料描述文本。这两个版本的描述信息成功同步到SAPCRM后,客户再删除ERP中中文版的描述文本。此删除操作无法同步到SAPCRM。.于是Jerry之前工作的SAPCRM开发团队在SAPCRMEHP3中开发了一个新的功能来支持上述场景。下图是在事务码SFW5中包裹这个新功能的BusinessFunction,ID为CRM_PROD_REQ_LOAD_SUBTRACTION。它目前处于非活动状态。双击进入业务功能详情页,找到关联的业务开关CRM_PROD_SETTYPE_RL_SUBTRACT。在ABAP代码中,我们使用工具类来判断开关的状态。如果状态为关闭,则直接返回,不执行后续包含新功能的代码。总之,SAPABAPEnhancementPackage中新加入的应用业务逻辑总是被包裹在一个IF代码块中,作为条件评估检查业务切换的状态。伪代码如下:IF对应的业务交换机处于打开状态。执行增强包新函数ENDIF。除了代码逻辑,前端UI页面某些元素的显示也可以通过业务开关进行动态控制。例如下图中SAPCRM产品搜索页面的SimpleSearch按钮,是由ID为CRM_MD_PRD_SEARCH的服务开关控制的。只有当开关打开时,才会执行下图中第6行开始的代码,在页面上绘制按钮。简而言之,当SAPEnhancementPackage安装到系统中时,增强包中的代码、数据库表和其他ABAP资源都存储在系统中。除非明确启用新功能对应的服务开关,否则新功能不会生效。SAP电子商务云还可以采用SAP电子商务云SpartacusUI中所谓的FeatureLevel概念,为用户提供选择性启用一些新功能的灵活性。SAP电商云SpartacusUI本身就是一个高度模块化的Storefront开发框架和开发库。将电子商务网站运营所涉及的功能块按照业务层次划分并实现在不同的功能模块(FeatureModules)中。这些功能模块列表如下图所示:客户在实施Spartacus时,可以根据自己的实际业务选择性安装功能模块。下图就是一个例子。我在安装Spartacus的时候选择了StoreFinder和Tracking相关的几个功能模块,但是没有选择ProductConfigurator、Qualtrics和SmartEdit这三个功能模块:客户最后决定启用的所有功能模块,通过蓝色的安装控制台高亮显示信息:基于选择的功能模块,构建的JavaScriptBundles文件如下图所示:未启用的功能模块不会参与构建,当然也不会出现在最终的SpartacusStorefront运行时环境。这种机制有助于减少构建的JavaScriptStorefrontBundle的文件大小,并提高运行时加载资源的速度。至此不难看出SAP电商云SpartacusUI功能模块的选择性安装机制与本文前半部分介绍的SAPABAP增强包完全安装部分启用的机制不同.当然,SAP电商云SpartacusUI也有类似SAPABAP增强包的行为,即客户在本地安装了新功能的实现代码,但是通过一个控件暂时不启用某些开关。FeatureLevel扮演这个开关的角色。由于历史原因,修改电商页面的全局Directionality等特性并没有封装在一个功能模块中,而是通过FeatureLevel进行控制。世界上一些国家和地区,比如使用阿拉伯语和希伯来语的客户,习惯从右到左浏览网页。为了满足SAP产品标准之一,即国际化(Internationalization,简称i18n),SAP电商云SpartacusUI也支持这些客户的浏览习惯。下图是从左到右呈现的默认SAP电商云主页。屏幕上方最左边是SAPLogo,屏幕上方最右边是购物车图标:产品详情页,左侧是产品图片,添加到购物车按钮在右边:下面是测试。我们使用如下配置,告诉SAP电商云SpartacusUI,当客户使用的语言为zh,也就是中文时,让电商页面按照从右到左(RighttoLeft,RTL)模式渲染:在RTL显示模式下,SAPLogo和购物车的位置颠倒了,整个屏幕变成了LTR模式显示页面的镜像。根据Spartacus官网文档,从2.1版本开始就提供了对Directionality的支持。在Spartacus的初始化钩子函数APP_INITIALIZER中,有一段代码包裹在一个IF语句中。逻辑和介绍ABAP业务切换时提到的伪代码非常相似。这段代码的语义是,如果当前SpartacusFeatureLevel大于等于2.1,则进行Directionality相关的逻辑处理。因此,如果由于某种原因,需要在2.1之后的版本中暂时禁用Directionality,除了修改相应的语言配置外,最快的办法是将当前Spartacus应用的FeatureLevel降低到2.1之前的版本,比如2.0:这样,虽然我在116行的设置中让Spartacus在客户中文登录时以RTL模式显示,但是110行的FeatureLevel设置的优先级更高。本例中,由于当前的FeatureLevel不满足开启Directionality的最低要求,所以当我最后用中文登录时,Spartacus依然使用默认的LTR模式显示:SAP电商云SpartacusUI的FeatureLevelcan控制应用程序除了执行逻辑外,还可以像上面介绍的ABAP业务切换一样动态控制UI元素的显示,使用方法更简洁易懂。让我们看一个具体的例子。下图是SAP电商云SpartacusUI的购物车界面。单击红色的ProceedToCheckout按钮跳转到结帐页面。点击ProceedToCheckout按钮后,我们会向SAPCommerceCloud后台发起CartValidationAPI调用,验证当前购物车的内容。我们最初的实现并没有禁用按钮,所以如果用户在短时间内快速点击按钮,每次点击都会触发一次API调用:所以,在4.2版本中,我们使用了自研的按钮控件ProgressButton,替换了以前版本中使用的普通按钮。在用户点击这两个按钮之前,外观上没有区别。但是点击之后ProgressButton会有旋转动画效果,让客户无法重复点击。ProgressButton点击后,外观如下:两个按钮在最终渲染的HTML页面中的源码差异如下:在购物车页面中,我们使用自定义指令cxFeatureLevel来实现的条件显示逻辑两个按钮:如果FeatureLevel小于4.2,显示一个普通的Button;否则,显示一个ProgressButton:自定义指令cxFeatureLevel的实现原理是,当指令传入的FeatureLevel与当前应用配置的FeatureLevel匹配时,调用AngularViewContainerRef动态创建视图,通过createEmbeddedView方法绘制应用指令的DOM元素。总结ABAP业务切换和SAP电商云SpartacusUI的FeatureLevel。两者的实现原理不同,但都可以为客户提供一定的自由度,让客户灵活控制某些业务功能的开启和关闭。Jerry的SAPE-CommerceCloudSpartacusUI开发宝典从一个实际例子出发,聊聊SAPCommerceCloud电商云的UI自定义开发,SAPCommerceCloud(电商云)UI的懒加载功能,SAPCRMFioriapplication和SAPCommerceCloud(电商云)UI如何通过调整CSS来改变UI显示风格SAPCommerceCloud(电商)的实现体现了与SAP产品一致的UI增强思想云)用户界面增强。一小时本地搭建SAPCommerceCloud(电商云)的前后端运行环境SAPCommerceCloud(电商云)自定义配置和开发路由路径SAPUI渲染方式:客户端渲染VSserver-siderendering响应式编程是SAP标准产品UI开发SAPCommerce中的一种实践更多Jerry关于CloudUI的用户会话管理的原创文章在这里:《汪子熙》:
