Primefaces menubar não renderiza certo após submit

Tenho um menu dinâmico construido com primefaces. Logo na sua primeira execução tudo é executado perfeitamente. Mas se clicar em algum botão que de um submit em qualquer form o menu é renderizado errado, os itens de menu desaparecem
eis o codigo html

<h:form> <p:outputPanel id="panelMenus"> <p:menubar autoSubmenuDisplay="false" model="#{UsuarioMB.menubar}" rendered="#{UsuarioMB.usuario.codPessoa>0}"> </p:menubar> </p:outputPanel> </h:form>
e o código que gera os menus

if (tag == menu.getTag()) { if (menu.getNivel() == 1) { m = new Submenu(); m.setLabel(menu.getDescricao()); m.setId("menu" + menu.getCodMenu().toString()); } else { mi = new MenuItem(); mi.setValue(menu.getDescricao()); mi.setUrl("/faces/" + menu.getPaginaWeb()); mi.setId("menuItem" + menu.getCodMenu().toString()); mi.setAjax(false); m.getChildren().add(mi); } } else { tag = menu.getTag(); m = new Submenu(); m.setLabel(menu.getDescricao()); m.setId("menu" + menu.getCodMenu().toString()); } menubar.addSubmenu(m); }
e as imagens dos comportamentos dos menus:
antes do submit

e depois do submit

Será algum problema do primefaces ou estou com alguma coisa errada nos meus códigos?
Agradeço a atenção

cara… coloca no parametro deste menu o codigo ajax=“false” que resolve

tipo assim

<p:menuitem value=“Incluir Contato” action="#{agendaBean.abrirCadastro}" ajax=“false” />

ele esta usando o componente do ajax e pelo que eu sei o ajax nao redireciona pagina…

me corrijam se eu estiver errado!!

se resolver posta aqui :slight_smile:

Valeu cara, mas já faço isso em mi.setAjax(false);. Ainda não encontrei uma solução a contento…

Pelo visto você segue uma linha de raciocinio diferente para criar uma menubar.

Creio que você quer que ao clicar em um MenuItem sejam atualizados os dados numa determinada região da pagina certo?

tente criar algo como:

<p:menubar>
                <p:submenu label="Sistema">
                    <p:menuitem value="Ação1" action="#{seuMB.acao1}"/>
                    <p:menuitem value="Ação2" action="#{seuMB.acao2}" update="algumComponente"/>
                </p:submenu>
</p:menubar>

<p:panel id="algumComponente">
                <!-- O RESTO DOS ITENS -->
</p:panel>

E na sua MB…

public void acao1() {
               setAlgumTexto("aaaaaaa");
               if (metodo()) {
                       setAlgumTexto2("Verificado");
               }
}
.
.
.

Sei que assim parece ser mais trabalhoso, porém voce não precisará em tratar o item selecionado. Você poderá criar este menu somente uma vez num arquivo à parte e importá-lo nas suas outras paginas usando a ui:include

Caso queira algo um pouco mais complexo. Podes definir as propriedades “rendered” de cada submenu ou menuitem pela camada de Controle.

Espero ter ajudado!

regisleandro,

Estou tentando montar um menu dinâmico também, só que o meu não aparece na tela, aparece somente um menu fininho com as opções, de onde vem seu import do UsuarioMB.menubar ?
Conseguiu resolver o seu problema? Caso sim, como? Pode ser que eu tenha o mesmo quando monstar o menu.

Regis,

Conseguiu resolver este problema?

Estou tendo passando pela mesma situação…

@braços

[quote=ccllss]Regis,

Conseguiu resolver este problema?

Estou tendo passando pela mesma situação…

@braços[/quote]
Tente

ajax="false"

Olá Cesar,

Como disse o Regis:

Eu estou fazendo isso “.setAjax(false)” qdo construo dinamicamente o menu, gerando um model e aplicando no menubar.

<p:menubar effectDuration="50" model="#{acessoForm.module.menuModel}" />

Se der um submit na página ele não renderiza mais os itens do menu que está na sessão.

@braços

[quote=ccllss]Olá Cesar,

Como disse o Regis:

Eu estou fazendo isso “.setAjax(false)” qdo construo dinamicamente o menu, gerando um model e aplicando no menubar.

<p:menubar effectDuration="50" model="#{acessoForm.module.menuModel}" />

Se der um submit na página ele não renderiza mais os itens do menu que está na sessão.

@braços[/quote]
Não lembro o que eu fiz então, estou no trabalho agora sem o fonte. Anoite quando chegar em casa coloco minha classe aqui para você. Eu lembro que era alguma bobeira, tipo a ordem de alguma coisa, rsrsrs.

Legal Cesar… Agradeço!

@braços

Pessoal estou construindo uma aplicação onde tenho um template full page e no top desse layout tenho um menubar. Quero quando acionar o menuitem (ajax) o meu contener central atualize (apenas ele). Teria como alguém me ajudar? Exemplos? Grato pela atenção de todos.

regisleandro,

Estou com o mesmo problema…alguém conseguiu resolver?

Estou com o mesmo problema…alguém conseguiu resolver?

camolesi,

Eu consegui resolver da seguinte forma:

  Notei que ai iniciar a aplicação tudo funcionava normal, o problema ocorre ao clicar pela primeira vez em qualquer dos menus. Aparente o prime perde a referencia do menu, e é como se não encontrasse as páginas, daí eu coloquei no construtor do meu MenuMB a chamada para gerar os menus.

Segue o código do meu MenuMB:

public class MenuMB {

	private MenuModel menuModel = new DefaultMenuModel();

	public MenuMB() {
	}

	public MenuModel getMenuModel() {
		if (UsuarioMB.getLoginPerfil() != null) {
			geraMenu("sicad");
		}
		return menuModel;
	}

	public void setMenuModel(MenuModel menuModel) {
		this.menuModel = menuModel;
	}

	public void geraMenu(String modulo) {
		menuModel = new DefaultMenuModel();
		MenuDao menuDAO = new MenuDao();
		String usuario = UsuarioMB.getLoginPerfil().getLogin();
		List<Menu> listaMenu = menuDAO.buscaPorMenuUsuario(usuario, modulo);

		for (Menu menu : listaMenu) {
			if (menu.getMenu() == null) {
				Submenu submenu = new Submenu();
				submenu.setLabel(menu.getDescricao());
				for (Menu m : menuDAO.buscaPorMenu(menu, usuario)) {
					if (!menuDAO.verificaSubMenu(m, usuario)) {
						MenuItem mi = new MenuItem();
						mi.setValue(m.getDescricao());
						mi.setAjax(false);
						if (m.getAcao() != null) {
							mi.setActionExpression(createMethodExpression(m
									.getAcao()));
						}
						if (m.getUrl() != null) {
							mi.setUrl(m.getUrl());
						}

						submenu.getChildren().add(mi);
					} else {
						Submenu sm = new Submenu();
						sm.setLabel(m.getDescricao());
						sm = geraSubmenu(m);
						submenu.getChildren().add(sm);
					}
				}
				menuModel.addSubmenu(submenu);
			}
		}
	}

	/*
	 * private MethodExpression criarAcao(String acao) { MethodExpression
	 * actionExpression = FacesContext .getCurrentInstance() .getApplication()
	 * .getExpressionFactory() .createMethodExpression(
	 * FacesContext.getCurrentInstance().getELContext(), acao, null, new
	 * Class[0]); return actionExpression; }
	 */

	private MethodExpression createMethodExpression(String action) {

		final Class<?>[] paramTypes = new Class<?>[0];

		MethodExpression methodExpression = getExpressionFactory()
				.createMethodExpression(getELContext(), action, null,
						paramTypes);

		return methodExpression;
	}

	private ValueExpression createValueExpression(String binding,
			Class<String> clazz) {
		final ValueExpression ve = getExpressionFactory()
				.createValueExpression(getELContext(), binding, String.class);

		return ve;
	}

	public static ELContext getELContext() {

		return FacesContext.getCurrentInstance().getELContext();

	}

	public static ExpressionFactory getExpressionFactory() {

		return getApplication().getExpressionFactory();

	}

	public static Application getApplication() {

		return FacesContext.getCurrentInstance().getApplication();

	}

	public Submenu geraSubmenu(Menu menu) {
		String usuario = UsuarioMB.getLoginPerfil().getLogin();
		Submenu submenu = new Submenu();
		MenuDao menuDAO = new MenuDao();
		submenu.setLabel(menu.getDescricao());
		for (Menu m : menuDAO.buscaPorMenu(menu, usuario)) {
			if (!menuDAO.verificaSubMenu(m, usuario)) {
				MenuItem mi = new MenuItem();
				mi.setValue(m.getDescricao());
				// mi.setActionExpression(createMethodExpression(m.getAcao()));
				mi.setAjax(false);
				if (m.getAcao() != null) {
					mi.setActionExpression(createMethodExpression(m.getAcao()));
				}
				if (m.getUrl() != null) {
					mi.setUrl(m.getUrl());
				}
				mi.setStyle("width:100px");
				submenu.getChildren().add(mi);
			} else {
				submenu.getChildren().add(geraSubmenu(m));
			}
		}
		return submenu;
	}

}

jadirrlima , Muito Obrigado !!!