Erro ao montar um JsCookMenu - Tomahawk[Onde estão os entendidos?]

Bom dia srs,

Estou com um problema ao montar o meu menu com o core do tomahawk.

Ele apenas monta dois níveis, à partir daí, esquece, nada é mostrado. Vou anexar uma imagem para maiores esclarecimentos do erro.

Meu Managed Bean segue abaixo:

/**
 * 
 */
package br.com.sofisa.pcfi.adm.mbean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.myfaces.custom.navmenu.NavigationMenuItem;

import br.com.sofisa.pcfi.adm.business.bo.menu.MenuBO;
import br.com.sofisa.pcfi.adm.vo.menu.MenuVO;

/**
 * @author FGuerra
 *
 */
public class Menu {
	
	private List<MenuVO> menu_ = null;
	private Map sortMenu = null;
	
	/**
	 * @param menu the menu to set
	 */
	public void setMenu(List<MenuVO> menu) {
		this.menu_ = menu;
	}
	
	/**
	 * Consulta o menu no BD
	 */
	private void loadMenu() {
		MenuBO menuBO = null;
		
		try {
			menuBO = new MenuBO();
			
			menu_ = menuBO.getMenu();
			
		}catch(Exception e) {
			e.printStackTrace();
			
		}
		
	}
	/**
	 * @return Os ítens do menu que serão iterados pelo tomahawk
	 */
	@SuppressWarnings("unchecked")
	public List<NavigationMenuItem> getMenu() {
		List<NavigationMenuItem> menu = null;
		Map mMenu = new HashMap();
		NavigationMenuItem rootMenu = null;
		List<NavigationMenuItem> child = new ArrayList<NavigationMenuItem>();
		int aux = -1;
		
		try {
			loadMenu();
			setSortMenu(menu_);
			
			if(menu_!=null && menu_.size()>0) {
				menu = new ArrayList<NavigationMenuItem>();
				
				for(int i=0; i<menu_.size(); i++) {
					MenuVO menuVO = menu_.get(i);
					
					if(menuVO.getCdSuperior()==0) {
						rootMenu = new NavigationMenuItem(menuVO.getDsMenu(), menuVO.getUrlMenu());
						setRootMenu(menu, rootMenu);
						addSortMenu(mMenu, menuVO.getIdMenu(), rootMenu);
						
					}else {
						if(menuVO.getCdSuperior()!=aux) {
							getMenuFilho(menuVO.getCdSuperior(), mMenu, menu_, i);
							aux = menuVO.getCdSuperior();
						}
						
					}
					
				}
			
			}
			
		}catch(Exception e) {
			e.printStackTrace();
			
		}
		return menu;
		
	}
	
	@SuppressWarnings("unchecked")
	/**
	 * Método para popular o Map ordenado com os VOs e respectivos identificadores;
	 * @param menu
	 */
	private void setSortMenu(List><MenuVO> menu) {
		sortMenu = new HashMap();
		
		for(int i=0; i<menu.size(); i++) {
			MenuVO itemMenu = (MenuVO) menu.get(i);
			
			sortMenu.put(itemMenu.getIdMenu(), itemMenu);
			
		}
		
	}
	
	/**
	 * Seta o menu filho no primeiro nível que será apresentado na tela;
	 * @param menu
	 * @param childMenu
	 */
	private void setRootMenu(List><NavigationMenuItem> menu, NavigationMenuItem childMenu) {
		menu.add(childMenu);
		
	}
	
	/**
	 * Adiciona o ítem do menu no Map;
	 * @param sortMenu
	 * @param pk
	 * @param navMenuItem
	 */
	@SuppressWarnings("unchecked")
	private void addSortMenu(Map sortMenu, Integer pk, NavigationMenuItem navMenuItem) {
		if(!sortMenu.containsKey(pk))
			sortMenu.put(pk, navMenuItem);
		
	}
	
	/**
	 * Método para resgatar um Item do menu através de seu identificador;
	 * @param sortMenu
	 * @param pk
	 * @return NavigationMenuItem
	 */
	private NavigationMenuItem getNavMenuItem(Map sortMenu, Integer pk) {
		NavigationMenuItem navMenuItem = (NavigationMenuItem) sortMenu.get(pk);
		
		return navMenuItem;
	}
	
	/**
	 * Método para adicionar os filhos ao menu pai;
	 * @param cdSuperior
	 * @param mapMenu
	 * @param menu
	 * @param indexList
	 */
	@SuppressWarnings("unchecked")
	private void getMenuFilho(int cdSuperior, 
							Map mapMenu, 
							List<MenuVO> menu, 
							int indexList) {
		List<NavigationMenuItem> childs = new ArrayList<NavigationMenuItem>();
		
		for(int i = indexList; i<menu.size(); i++) {
			MenuVO menuVO = menu.get(i);
			
			//Adiciona o menu ao Map para ser resgatado posteriormente
			if(menuVO.getCdSuperior()>0 && "javascript:void(0)".equalsIgnoreCase(menuVO.getUrlMenu())) {
				addSortMenu(mapMenu, menuVO.getIdMenu(), new NavigationMenuItem(menuVO.getDsMenu(), menuVO.getUrlMenu()));
				
			}
			
			if(menuVO.getCdSuperior()!=cdSuperior) 
				break;
				
			childs.add( new NavigationMenuItem(menuVO.getDsMenu(), menuVO.getUrlMenu()) );

		}
		
		//Resgata o menu pai
		NavigationMenuItem menuPai = getNavMenuItem(mapMenu, cdSuperior);
		
		//Adiciona os filhos no pai
		if(menuPai!=null) 
			menuPai.setNavigationMenuItems(childs);
		
	}
	
}

O pessoal deve estar sem tempo mesmo!


Ninguém responde sobre JSF…ta complicado!

UP!

[size=9]Não queria fazer isso, mas…[/size]

nossa senhora haja gambi rsrs

por que você não monta o teu menu “no braço”?

você quer montar um menu dinamicamente é isso?

Gambi aonde?

Sim, é isso…algum conselho?

até onde sei, pra montar qualquer componente do faces é um pouco diferente, mas deixemos isso pra outra situação

e sobre a gambi era zuera rsrs só ficou meio assustador o jeito que tu montou hehe, mas vamos lá:

1- fazer com que o teu backing bean retorne uma lista de navigationMenuItem

[code]public List getMenuItems() {
List resultado = new ArrayList();

	// Vamos criar inserir os seus respectivos filhos, de acordo com uma lista de parâmetros
	// Aqui podemos supor que isso poderia ser uma lista que vem de um DAO, DTO Factory ou whatever
	List<String> listaMenus = new ArrayList<String>();
	listaMenus.add( "Menu 1" );
	listaMenus.add( "Menu 2" );
	listaMenus.add( "Menu 3" );
	listaMenus.add( "Menu 4" );
	listaMenus.add( "Menu 5" );
	
	// O esquema aqui é simples: Cada NavigationMenuItem inserido na List resultado, vai ser o menu principal
	// Cada NavigationMenuItem inserido em outro, vai ser um submenu, look this
	for( String nomeMenu : listaMenus ) {
		// O NULL é o nome da action, como só queremos mostrar como faz pra montar o menu dinamicamente, vamos deixar como está
		NavigationMenuItem item = new NavigationMenuItem( nomeMenu, null ); 
		
		// Vamos colocar duas opções em cada menu
		NavigationMenuItem opcao1 = new NavigationMenuItem( "Opção 1", null );
		NavigationMenuItem opcao2 = new NavigationMenuItem( "Opção 2", null );
		
		// Aqui ele insere essas opções no menu
		item.add( opcao1 );
		item.add( opcao2 );
		
		// E agora botamos no menu principal, um meno Menu X com duas opções: Opção 1 e Opção 2
		resultado.add( item );
	}
	
	return resultado;
}[/code]

e agora basta criar o teu JSCookMenu

<t:jscookMenu layout="hbr" theme="ThemeOffice" styleLocation="css/jscookmenu"> <t:navigationMenuItems id="navitems" value="#{menuBean.menuItems}" /> </t:jscookMenu>

Algumas obversações:

  • Até onde sei, você precisa ter os css e os js do JSCookMenu na tua aplicação, NÃO SEI se o tomahawk com o extension filter já disponibiliza isso
  • Não esqueça de botar no HEAD da tua aplicação, na minha fica assim:
<link href="/jscookmenu/ThemeOffice/theme.css" rel="stylesheet" type="text/css" />
  • Se você quiser que um determinado MenuItem execute um action, você precisa fazer com que no form que está o JSCookmenu, tenha essa tag aqui:
<t:inputHidden forceId="true" id="jscook_action" />

É super fácil de criar, mas pra funcionar do jeito que a gente quer, tem que quebrar um pouco a cabeça rsrs

Mas esse JSCookMenu é muito legal :slight_smile:

nesse link tem: os Javascript, os CSS e exemplo com outros temas, vale a pena dar uma olhada
http://jscook.yuanheng.org/JSCookMenu/

Espero ter ajudado

Abraços

Exemplo bem didático, mas ele contempla vários níveis?

Um menu que tenha n níveis?

você não conseguiu entender o raciocínio?

o N níveis é o número de N menuItem que você vai botar dentro de outro hehehehe