2016-08-08 34 views
1

Ich habe ein PanelMenu erstellt und ich habe versucht, ein Symbol zum Root-Untermenü hinzuzufügen, aber es funktioniert nicht.Sind Benutzer-Icons auf Root-Untermenüs in PrimeFaces 6.0 PanelMenu

<p:panelMenu> 
    <p:submenu label="Üye işlemleri" icon="fa fa-user-plus"> 
     <p:menuitem value="Üye Kayıt" icon="fa fa-user-plus" 
      action="#{redirect.toRegister()}" /> 
     <p:menuitem value="Üye Düzenle" icon="fa fa-pencil" /> 
    </p:submenu> 
    <p:submenu label="Kullanıcı işlemleri" icon="ui-icon-extlink"> 
     <p:menuitem value="Anasayfa" icon="fa fa-home" 
      action="#{redirect.toMainPage()}" /> 
     <p:menuitem value="Üye Kayıt" icon="fa fa-user-plus" 
      action="#{redirect.toRegister()}" /> 
     <p:menuitem value="Üye Düzenle" icon="fa fa-pencil" /> 
    </p:submenu> 
</p:panelMenu> 

enter image description here

Haben Sie eine Idee? Ich habe es auch mit ui-icon (nicht fontawesome) versucht. Ich möchte das Standard-Untermenü nicht ändern. Ich möchte neben Standard-Symbol wie auf this page hinzufügen. Sie können in dem Beispiel besonders in Navigation> Link sehen. Wie Sie sehen können, Link ist ein Untermenü. Müssen wirklich zwei Untermenüs ineinander sein, um ein Icon hinzuzufügen?

bearbeiten ------

Klasse get machen Mein erstreckt sich auf "PanelMenuRenderer" und meine faces-config.xml ist;

<render-kit> 
    <renderer> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.PanelMenuRenderer</renderer-type> 
     <renderer-class>denemeExample.my</renderer-class> 
    </renderer> 
</render-kit> 

Wenn ich versuche, es auszuführen, erhalte ich einen Fehler.

An Error Occurred: 

javax/servlet/jsp/jstl/core/Config 
- Stack Trace 

java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config 
    at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:344) 
    at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:153) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Ich habe versucht, dieses Hinzufügen jstl-1.2.jar und jsp-api.jar innen WEB-INF/lib aber nicht gelöst und Server zu arbeiten beginnt unlogical zu lösen. Es funktioniert kein Code in xhtml wie p: outputLabel oder h: outputLabel. Ich denke, Kater läuft nicht. Zuletzt benutze ich PrimeFaces 6.0 und jsf 2.2. Hast du eine Idee, was soll ich tun?

Antwort

2

Müssen wirklich zwei Untermenüs ineinander eingefügt werden, um ein Icon hinzuzufügen?

Einfach ja. Wie in PrimeFaces Documentation angegeben:

Erste Ebene der Untermenüs werden als Akkordeon-Panels gerendert und Nachkommen Untermenüs gerendert werden als Baumknoten.

Wenn man sich die source code anschauen, werden Sie feststellen, dass Benutzer Symbole in Wurzeluntermenüs werden nicht berücksichtigt in encodeRootSubmenu() genommen werden. Andererseits werden in encodeDescendantSubmenu() die Benutzer-Icons von untergeordneten Untermenüs berücksichtigt.

Eine mögliche Lösung Benutzersymbol Unterstützung für die Wurzeluntermenüs in PanelMenus, zu erhalten, ist eine benutzerdefinierte Renderer zu erstellen, basierend auf PanelMenuRenderer und encodeRootSubmenu() außer Kraft zu setzen. Vielleicht hilft Ihnen this question als Ausgangspunkt.

+0

Vielen Dank Ihre Nachricht und Änderungen an meiner Frage. Ich werde es morgen tun und ich werde meine Post mit der Lösung bearbeiten. Danke nochmal :) –

1

Diese Lösung ist von Irieill's Post maden. Eigentlich ist es nicht schwer, was ich gemacht habe, aber auf jeden Fall dachte ich, ich sollte es posten.

Dies ist customPanelMenuRenderer (Es ist Paket "com" ist)

public class customPanelMenuRenderer extends BaseMenuRenderer { 

@Override 
protected void encodeScript(FacesContext context, AbstractMenu abstractMenu) throws IOException { 
    PanelMenu menu = (PanelMenu) abstractMenu; 
    String clientId = menu.getClientId(context); 
    WidgetBuilder wb = getWidgetBuilder(context); 
    wb.initWithDomReady("PanelMenu", menu.resolveWidgetVar(), clientId).attr("stateful", menu.isStateful()); 
    wb.finish(); 
} 

@Override 
protected void encodeMarkup(FacesContext context, AbstractMenu abstractMenu) throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    PanelMenu menu = (PanelMenu) abstractMenu; 
    String clientId = menu.getClientId(context); 
    String style = menu.getStyle(); 
    String styleClass = menu.getStyleClass(); 
    styleClass = styleClass == null ? PanelMenu.CONTAINER_CLASS : PanelMenu.CONTAINER_CLASS + " " + styleClass; 

    writer.startElement("div", menu); 
    writer.writeAttribute("id", clientId, "id"); 
    writer.writeAttribute("class", styleClass, "styleClass"); 
    if (style != null) { 
     writer.writeAttribute("style", style, "style"); 
    } 
    writer.writeAttribute("role", "menu", null); 

    if (menu.getElementsCount() > 0) { 
     List<MenuElement> elements = menu.getElements(); 

     for (MenuElement element : elements) { 
      if (element.isRendered() && element instanceof Submenu) { 
       encodeRootSubmenu(context, menu, (Submenu) element); 
      } 
     } 
    } 

    writer.endElement("div"); 
} 

protected void encodeRootSubmenu(FacesContext context, PanelMenu menu, Submenu submenu) throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    String style = submenu.getStyle(); 
    String icon = submenu.getIcon(); 
    String styleClass = submenu.getStyleClass(); 
    styleClass = styleClass == null ? PanelMenu.PANEL_CLASS : PanelMenu.PANEL_CLASS + " " + styleClass; 
    boolean expanded = submenu.isExpanded(); 
    String headerClass = expanded ? PanelMenu.ACTIVE_HEADER_CLASS : PanelMenu.INACTIVE_HEADER_CLASS; 
    String headerIconClass = expanded ? PanelMenu.ACTIVE_TAB_HEADER_ICON_CLASS : PanelMenu.INACTIVE_TAB_HEADER_ICON_CLASS; 
    System.out.println("headerIconClass = " + headerIconClass); 
    System.out.println("icon = " + icon); 
    boolean hasIcon = (icon != null); 
    String contentClass = expanded ? PanelMenu.ACTIVE_ROOT_SUBMENU_CONTENT : PanelMenu.INACTIVE_ROOT_SUBMENU_CONTENT; 

    //wrapper 
    writer.startElement("div", null); 
    writer.writeAttribute("class", styleClass, null); 
    if (style != null) { 
     writer.writeAttribute("style", style, null); 
    } 

    //header 
    writer.startElement("h3", null); 
    writer.writeAttribute("class", headerClass, null); 
    writer.writeAttribute("role", "tab", null); 
    writer.writeAttribute("tabindex", "0", null); 

    //icon 
    writer.startElement("span", null); 
    writer.writeAttribute("class", headerIconClass, null); 
    writer.endElement("span"); 

    //user icon 
    if (hasIcon) { 
     writer.startElement("span", null); 
     writer.writeAttribute("class", "ui-icon " + icon, null); 
     writer.endElement("span"); 
    } 

    writer.startElement("a", null); 
    writer.writeAttribute("href", "#", null); 
    writer.writeAttribute("tabindex", "-1", null); 
    writer.writeText(submenu.getLabel(), null); 
    writer.endElement("a"); 

    writer.endElement("h3"); 

    //content 
    writer.startElement("div", null); 
    writer.writeAttribute("class", contentClass, null); 
    writer.writeAttribute("role", "tabpanel", null); 
    writer.writeAttribute("id", menu.getClientId(context) + "_" + submenu.getId(), null); 
    writer.writeAttribute("tabindex", "0", null); 

    if (submenu.getElementsCount() > 0) { 
     List<MenuElement> elements = submenu.getElements(); 

     writer.startElement("ul", null); 
     writer.writeAttribute("class", PanelMenu.LIST_CLASS, null); 

     for (MenuElement element : elements) { 
      if (element.isRendered()) { 
       if (element instanceof MenuItem) { 
        MenuItem menuItem = (MenuItem) element; 
        String containerStyle = menuItem.getContainerStyle(); 
        String containerStyleClass = menuItem.getContainerStyleClass(); 
        containerStyleClass = (containerStyleClass == null) ? Menu.MENUITEM_CLASS : Menu.MENUITEM_CLASS + " " + containerStyleClass; 

        writer.startElement("li", null); 
        writer.writeAttribute("class", containerStyleClass, null); 
        if (containerStyle != null) { 
         writer.writeAttribute("style", containerStyle, null); 
        } 
        encodeMenuItem(context, menu, menuItem); 
        writer.endElement("li"); 
       } else if (element instanceof Submenu) { 
        encodeDescendantSubmenu(context, menu, (Submenu) element); 
       } 
      } 
     } 

     writer.endElement("ul"); 
    } 

    writer.endElement("div"); //content 

    writer.endElement("div"); //wrapper 
} 

protected void encodeDescendantSubmenu(FacesContext context, PanelMenu menu, Submenu submenu) throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    String icon = submenu.getIcon(); 
    String style = submenu.getStyle(); 
    String styleClass = submenu.getStyleClass(); 
    styleClass = styleClass == null ? PanelMenu.DESCENDANT_SUBMENU_CLASS : PanelMenu.DESCENDANT_SUBMENU_CLASS + " " + styleClass; 
    boolean expanded = submenu.isExpanded(); 
    String toggleIconClass = expanded ? PanelMenu.DESCENDANT_SUBMENU_EXPANDED_ICON_CLASS : PanelMenu.DESCENDANT_SUBMENU_COLLAPSED_ICON_CLASS; 
    String listClass = expanded ? PanelMenu.DESCENDANT_SUBMENU_EXPANDED_LIST_CLASS : PanelMenu.DESCENDANT_SUBMENU_COLLAPSED_LIST_CLASS; 
    boolean hasIcon = (icon != null); 
    String linkClass = (hasIcon) ? PanelMenu.MENUITEM_LINK_WITH_ICON_CLASS : PanelMenu.MENUITEM_LINK_CLASS; 

    writer.startElement("li", null); 
    writer.writeAttribute("id", submenu.getClientId(), null); 
    writer.writeAttribute("class", styleClass, null); 
    if (style != null) { 
     writer.writeAttribute("style", style, null); 
    } 

    writer.startElement("a", null); 
    writer.writeAttribute("class", linkClass, null); 

    //toggle icon 
    writer.startElement("span", null); 
    writer.writeAttribute("class", toggleIconClass, null); 
    writer.endElement("span"); 

    //user icon 
    if (hasIcon) { 
     writer.startElement("span", null); 
     writer.writeAttribute("class", "ui-icon " + icon, null); 
     writer.endElement("span"); 
    } 

    //submenu label 
    writer.startElement("span", null); 
    writer.writeAttribute("class", PanelMenu.MENUITEM_TEXT_CLASS, null); 
    writer.writeText(submenu.getLabel(), null); 
    writer.endElement("span"); 

    writer.endElement("a"); 

    //submenu children 
    if (submenu.getElementsCount() > 0) { 
     List<MenuElement> elements = submenu.getElements(); 

     writer.startElement("ul", null); 
     writer.writeAttribute("class", listClass, null); 

     for (MenuElement element : elements) { 
      if (element.isRendered()) { 
       if (element instanceof MenuItem) { 
        writer.startElement("li", null); 
        writer.writeAttribute("class", Menu.MENUITEM_CLASS, null); 
        encodeMenuItem(context, menu, (MenuItem) element); 
        writer.endElement("li"); 
       } else if (element instanceof Submenu) { 
        encodeDescendantSubmenu(context, menu, (Submenu) element); 
       } 
      } 
     } 

     writer.endElement("ul"); 
    } 

    writer.endElement("li"); 
} 
} 

Diese faces-config.xml ist

<render-kit> 
    <renderer> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.PanelMenuRenderer</renderer-type> 
     <renderer-class>com.customPanelMenuRenderer</renderer-class> 
    </renderer> 
</render-kit> 

Mit diesen Codes haben wir einen benutzerdefinierten Renderer und wir registrieren, um Gesichter -config.xml.Zuletzt von allen sollten wir CSS-Codes, in meiner Situation außer Kraft geschieht es Überschreibung dieser Klasse (Es könnte Veränderung in Ihrem Projekt)

.ui-panelmenu .ui-panelmenu-header .ui-icon.fa{} 

Schließlich haben Sie eine rootSubmenu mit Symbol.