【问题标题】:Flyout or Menu Dropdown in Portal 8 themesPortal 8 主题中的弹出或菜单下拉菜单
【发布时间】:2026-02-23 18:50:01
【问题描述】:

我想知道是否有人成功地为 WebSphere Portal Server v8 创建和使用了弹出或下拉菜单导航?

我们正在使用自定义主题。 我们想要做的是将主要页面保留在顶部导航栏上并拥有它,以便当您将鼠标悬停/单击该页面/选项卡时,菜单(弹出或下拉菜单)会显示子页面及其子页面等在。 欢迎任何建议和指点。 提前致谢。

【问题讨论】:

    标签: portal websphere-portal


    【解决方案1】:

    这个例子生成 ul-li 两级菜单,当然你可以生成更多的级别,如果你需要,你需要插入你的 html 和 javascript。将此 JSP 放入您的主题中,并包含到例如 head.jsp 或其他地方。

    查看此字符串 "your.main.page.unique.name" ,将其更改为您的首页唯一名称。还有功能isHiddenPage,如果你想从菜单中隐藏页面,只需将属性设置为页面hide.from.menu=true

    好的,伙计,如果您需要澄清,请告诉我

    <%@page import="com.ibm.portal.model.*"%>
    <%@page import="com.ibm.portal.navigation.*"%>
    <%@page import="com.ibm.portal.identification.*"%>
    <%@page import="com.ibm.portal.content.ContentNodeType"%>
    <%@page import="java.util.*"%>
    <%@page import="java.io.*"%>
    <%@page import="com.ibm.portal.ModelException"%>
    <%@page import="com.ibm.portal.ObjectNotFoundException"%>
    
    
    
    <%!
    
    public NavigationNode getNodeByName(NavigationModel nm, NavigationNode rootNode, String nodeUniqueName) throws ModelException {
        Iterator iter = nm.getChildren(rootNode);
        while(iter.hasNext()){
            NavigationNode node = (NavigationNode) iter.next();
            String uniqueName = node.getContentNode().getObjectID().getUniqueName();
            if (uniqueName!= null && uniqueName.equals(nodeUniqueName)) 
                return node;
        }
        return null;
    
    }
    
    public List<NavigationNode> getChildrenNodes(NavigationModel nm, NavigationNode parentNode) throws ModelException{
        List<NavigationNode> children = new ArrayList<NavigationNode>();
        Iterator iter = nm.getChildren(parentNode);
        while(iter.hasNext()){
            NavigationNode node = (NavigationNode) iter.next();
            children.add(node);
        }
        return children;
    }
    
    public String getId(Identification identification, NavigationNode node) throws com.ibm.portal.serialize.SerializationException{
        return identification.serialize( ( ( com.ibm.portal.Identifiable ) node ).getObjectID());
    }
    
    public boolean isHiddenPage(NavigationNode node){
        if (node instanceof com.ibm.portal.MetaDataProvider) {
            com.ibm.portal.MetaData iMetaData=((com.ibm.portal.MetaDataProvider) node).getMetaData();
            Object url=iMetaData.getValue("hide.from.menu");
            return (url != null && url.toString().equals("true"));
        }
        return false;
    }
    
    %>
    
    <%
    javax.naming.Context ctx = new javax.naming.InitialContext();
    NavigationModelHome nmh = (NavigationModelHome) ctx.lookup("portal:service/model/NavigationModel");;
    NavigationModel nm = nmh.getNavigationModelProvider().getNavigationModel(request, response);
    NavigationSelectionModelHome nsmh = (NavigationSelectionModelHome) ctx.lookup("portal:service/model/NavigationSelectionModel");
    NavigationSelectionModel nsmodel = nsmh.getNavigationSelectionModelProvider().getNavigationSelectionModel(request, response);
    
    NavigationNode rootNode = (NavigationNode) nm.getRoot();
    Identification identification = (Identification) ctx.lookup( "portal:service/Identification" );
    try{
        if (rootNode != null && nm.hasChildren(rootNode)) {
            NavigationNode myRootNode = getNodeByName(nm, rootNode, "your.main.page.unique.name");
                %>
                <ul>    
                <%
                    for (NavigationNode firstLevelPage: getChildrenNodes(nm, myRootNode )){
    
                    String title = firstLevelPage.getTitle(getLocale(pageContext));
                    String id = getId(identification, firstLevelPage);
                    boolean isNodeSelected = nsmodel.isNodeSelected(firstLevelPage); // if node selected you can apply css class to selected menu item 
                    boolean isHidden = isHiddenPage(firstLevelPage); // if node is hidden from menu just continue loop
                    %>
    
                        <li>
                        <portal-navigation:urlGeneration contentNode="<%=id%>">
                               <a class="trigger" href="<% wpsURL.write(out);%>" ><c:out value="<%=title%>"/></a>  
                        </portal-navigation:urlGeneration>
    
                            <%if (getChildrenNodes(nm,firstLevelPage ).size() > 0){%>
    
                                        <ul>
    
                                            <% 
                                                for (NavigationNode secondLevelPage: getChildrenNodes(nm,firstLevelPage )){
                                                String childTitle = secondLevelPage.getTitle(getLocale(pageContext));
                                                String childId = getId(identification, secondLevelPage);
                                                %>
    
                                                    <portal-navigation:urlGeneration contentNode="<%=childId%>">
                                                    <li><a href="<% wpsURL.write(out);%>" ><c:out value="<%=childTitle%>"/></a></li>  
                                                    </portal-navigation:urlGeneration>
    
                                            <%}%>   
    
                                        </ul>                               
    
                            <%} %>
                        </li>
    
                <%}%>
            </ul>           
    <%          
        }
    
        }
    }catch(ModelException e){
        e.printStackTrace();
    }
    
    %>                      
    

    PS。也许我的括号错了,检查一下

    【讨论】:

    • 确保您已将门户标签库包含在 head 或 menu jsp 中。 (门户网站导航)www-10.lotus.com/ldd/portalwiki.nsf/…
    • 只有我必须添加更多方法:protected Locale getLocale(PageContext pageContext) { Locale locale=null; try{ 上下文 ctx =new InitialContext(); PortalLocalizedContextHomelocalizedContextHome = (com.ibm.portal.model.PortalLocalizedContextHome) ctx.lookup(com.ibm.portal.model.PortalLocalizedContextHome.JNDI_NAME); locale=pageContext.getRequest().getLocale(); if (localizedContextHome !=null ) { com.ibm.portal.model.LocalizedContext 上下文 =localizedContextHome.getLocalizedContext(pageContext ); locale =context.getPreferredSupportedLocale(); } } catch(Exception e) { } 返回语言环境; }
    【解决方案2】:

    我做过的主题示例

    1) 简单的下拉菜单

    2) 多级下拉菜单

    我使用 ul 和 li 来制作下拉菜单,您可以更新 topnav.jsp。无法在此处粘贴代码,因为它显示不正确。

    祝你好运

    【讨论】:

    • 嗨,William,你做得很好,但朋友,我并不是在寻找那个。在这个 topnav.jsp 中,我们必须进行硬编码,但我正在 IBM websphere 门户 8 中寻找动态下拉菜单,即:如果我添加一个页面,该页面的链接应该动态出现在下拉菜单中。