SAP Portal中的替代样式(CSS)方法?

时间:2020-03-05 18:53:19  来源:igfitidea点击:

在当前项目中,我将覆盖许多SAP的Portal功能。我必须创建一个自定义的固定宽度框架,自定义的iView托盘,自定义的KM API功能等等。

对于所有这些自定义部分,我将不会使用由SAP主题编辑器实现的许多样式功能。我想做的是创建一个外部CSS,将其存储在Portal外部并引用它。外部存储将使更新更加容易,而不是将CSS存储在门户应用程序中。它还将允许所有自定义作品一次具有其样式。

不幸的是,我还没有找到一种方法来访问页面的HEAD部分,从而无法插入外部样式表。门户网站应用程序可以使用IResource对象来执行此操作,以访问内部引用,但不能访问另一台服务器上的项目。

我正在寻找能使我获得此功能的任何想法。我已经在SAP的SDN上发表过x帖子,但我怀疑我会在这里得到更好的答案。

解决方案

回答

我认为这是肮脏的骇客,但作为非门户网站开发人员,我会考虑使用JavaScript在指向新CSS文件的头部插入新的link元素。当然,我们会有一些未样式化的内容,因为脚本可能要等到部分页面被下载并呈现后才能运行,但这可能是一个适当的解决方案。

回答

我讨厌回答我自己的问题,但是我确实找到了一个潜在的解决方案,该解决方案没有得到很好的记录,并且以典型的SAP方式使用不推荐使用的方法。因此,它可能比Eric所建议的要肮脏一些。我是通过不相关的SDN论坛帖子找到它的。

基本上,我们将深入研究请求对象并收集PortalNode。一旦有了它,就要求它提供IPortalResponse的值。可以将此对象强制转换为PortalHtmlResponse。该对象有一个不赞成使用的方法getHtmlDocument。使用该方法,我们可以使用一些HTML镜像对象来获取标题并插入新链接。

样本:

IPortalNode node = request.getNode().getPortalNode();
IPortalResponse resp = (IPortalResponse) node.getValue(IPortalResponse.class.getName());
if (resp instanceof PortalHtmlResponse) {
    PortalHtmlResponse htmlResp = (PortalHtmlResponse) resp;
    HtmlDocument doc = htmlResp.getHtmlDocument();
    HtmlHead myHead = doc.getHead();
    HtmlLink cssLink = new HtmlLink("http://myserver.com/css/mycss.css");
    cssLink.setType("text/css");
    cssLink.setRel("stylesheet");
    myHead.addElement(cssLink);
}