如何为单个Xpage加载不同的主题

时间:2014-03-07 21:06:17

标签: xpages

在开始之前,之前已经问过这个问题,没有一个答案被接受,而且我无法使用提供的答案让它工作。 How to use multiple themes at the same time

我正在尝试使用dojoTreeGrid,它需要一个“扩展webstandard”的主题但是当我这样做时,我修复了树网格,但它打破了应用程序的许多其他部分。 Webstandard似乎与Bootstrap严重冲突。

我克隆了我的主题,并将“extends webstandard”添加到了克隆,然后只想在包含网格的Xpage上加载该主题。我试过输入一个“themeID:到属性。我已经创建了一个xp:view的参数(如上面链接的SO中所建议的那样)并且没有变化。

如何才能加载辅助主题而不是仅为此一个Xpage加载的主题?

3 个答案:

答案 0 :(得分:3)

实现这一目标的方法非常简单:将其他XPage放在自己的NSF中。

我知道这听起来很讽刺我:我经常告诉人们不要仅仅因为他们的数据存在于不同的地方而将他们的代码分成不同的容器。例如,为什么单个CRM应用程序有5个NSF,因为从数据架构的角度来看,将联系人,帐户,交互历史记录和其他数据分离为单独的NSF可能是有意义的。将所有代码保存在一个位置,然后从那里访问所有数据。

但是,在这种情况下,为什么不反过来呢?如果您只有一个页面具有用户界面要求会对应用程序其余部分的用户界面造成严重破坏,那么为什么不为该页面创建单独的应用程序?明显的缺点是,这会增加复杂性,确保目标页面具有足够的上下文来了解用户的来源,如何根据该上下文进行操作,以及如何确保原始应用程序被通知任何相关事件在用户返回时在另一个应用程序中发生...但设计此互惠上下文传输可能比使现有应用程序的每个方面更复杂更简单,以满足不能播放的这一页的视觉需求和其他人一起。

考虑专门设计的第三方Web应用程序,以允许源应用程序与它们集成,包括保留品牌。例如,当您在电子商务网站上构建购物车,然后使用PayPal结账,您暂时离开您所在的应用程序,现在您在PayPal的网站上,但您现在所在的页面已收到一些原产地背景 - 通常不仅是关于购买本身的信息,而且还有关于卖家的信息,允许至少一些最小的品牌,与您从其他卖家购买时所看到的不同。当您完成(或取消)购买时,您回到原来的位置,而原始应用程序“知道”您离开时发生的事情。

如果您要设计一个类似的过程,那么这个网格页面可以被众多应用程序重用,每个应用程序都告诉用户到达时如何查找必须显示的数据,以及如何根据用户的位置直观地表示它来自......以及如何在适当的时候将他们带回原处。

或者,您可以检查应用搜索功能中哪些缺陷需要在网格中开始显示数据,但这可能是讨论最好留给另一天。

答案 1 :(得分:2)

我找到了一种让TreeGrid获取苔原主题的方法,而不要求你的应用程序主题继承自webstandard。

我在生成的源代码中注意到,当主题扩展webstandard时,很多网格组件都有一类“tundra”(以及其他类)。当我创建(并应用)不从webstandard继承的空主题时,网格组件不会将“tundra”作为类继承。

相应地,当webstandard生效时,页面的<body>标签会获得一类tundra(和xspView),但是没有其他类。

我能够通过两个步骤修复网格样式:

1)包含dojo.css(因为在未扩展webstandard时似乎不包含它)。此示例将其作为页面级资源加载:

<xp:styleSheet href="/.ibmxspres/dojoroot/dojo/resources/dojo.css"></xp:styleSheet>

2)将网格<div>换行到另一个具有“tundra”类的<div>

<div class="tundra">
  <div style="width:400px; height:400px;" id="treeGrid"></div>
</div>

这在我的演示应用中修复了它。

这看起来很理想,因为它应该将样式限制为围绕网格的div。

答案 2 :(得分:1)

这种情况有些变化,并且在其他SO帖子中列出。

How to use multiple themes at the same time

    <xp:this.beforeRenderResponse><![CDATA[#{javascript:if (!"webstandard".equals(context.getSessionProperty("xsp.theme"))) {
    context.setSessionProperty("xsp.theme", "webstandard");
    context.reloadPage();
}}]]></xp:this.beforeRenderResponse>

以下是您需要包含的代码,以确保不同的xpage在阶段侦听器中获得不同的主题。

package com.tobysamples.listeners;

import java.io.IOException;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;

import com.ibm.xsp.designer.context.XSPContext;

public class ThemePhaseListener implements PhaseListener {

    private static final long serialVersionUID = 5981547066445581282L;

    public void afterPhase(PhaseEvent arg0) {


    }

    public void beforePhase(PhaseEvent arg0) {
        XSPContext context = XSPContext.getXSPContext(FacesContext.getCurrentInstance());
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if ((!"webstandard".equals(context.getSessionProperty("xsp.theme"))) && (context.getUrl().toString().contains("MyXpage.xsp"))) {
            context.setSessionProperty("xsp.theme", "webstandard");
            try {
                facesContext.getExternalContext().redirect((((HttpServletRequest)facesContext.getExternalContext().getRequest()).getRequestURI()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

}

并在faces-config.xml

  <lifecycle>
    <phase-listener>com.tobysamples.listeners.ThemePhaseListener</phase-listener>
  </lifecycle>