Jsf, campos irem aparecendo conforme preencho um deles

3 respostas
A

Galera,

Estou desenvolvendo uma tela de login com jsf, da seguinte maneira:

Tenho um campo de email, quando o usuario preenche ai aparece do lado mais dois campos para ele preencher, um se ele ja tem registro e outro se ele nao tem,

Este esquema de ir aparecendo os campos, nao consigo ter uma ideia de como faze-lo. Andei vendo umas documentacoes mas sem sucesso,

Alguem ja viu algo parecido?

grato

3 Respostas

jamirdeajr

Usando o ajax do primefaces dá pra fazer mais ou menos assim:

No xhtml - Usei no exemplo o event ‘blur’ que dispara ao sair do campo, se quiser pode usar ‘keyup’ também, só que irá disparar a cada tecla.

<h:inputText value="#{controleSession.login}" id="login" >
	<p:ajax event="blur" immediate="true" process="@this" update="@form" listener="#{controleSession.loginListener}" />
</h:inputText>

<h:inputText id="campo1" rendered="#{controleSession.campo1Ativado}">
</h:inputText>

<h:inputText id="campo2" rendered="#{controleSession.campo2Ativado}">
</h:inputText>

No bean “controleSession”

private Boolean campo1Ativado = false;
	private Boolean campo2Ativado = false;

	
	/**
	 * Listener ajax que atualiza os flags para renderizar campo 1 e 2
	 */
	
	public void loginListener() {
		
		
		FacesContext context = FacesContext.getCurrentInstance();
		
		UIInput ui = (UIInput) findComponent(context.getViewRoot(), "login");
		
		if(ui==null) return;
		
		String nome = (String) ui.getSubmittedValue();
		
		// Vazio não ativa nem um nem outro
		if(nome == null || nome.isEmpty()) {
			campo1Ativado = false;
			campo2Ativado = false;
			return;
		}
		
		// Aqui você colocaria sua validação de usuário
		if(nome.equalsIgnoreCase("joao")) {
			// Usuario existente
			campo1Ativado = true;
			campo2Ativado = false;
		} else {
			// Usuário novo
			campo1Ativado = false;
			campo2Ativado = true;
		}
	}



	/**
	 * Retorna o valor de um componente
	 * @param parent
	 * @param id
	 * @return
	 */
	protected UIComponent findComponent(UIComponent parent, String id) {
		if (id == null)
			return null;

		if (id.equals(parent.getId())) {
			return parent;
		}
		Iterator<UIComponent> kids = parent.getFacetsAndChildren();
		while (kids.hasNext()) {
			UIComponent kid = kids.next();
			UIComponent found = findComponent(kid, id);
			if (found != null) {
				return found;
			}
		}
		return null;
	}

Obs. Se for outra implementação jsf será bem parecido, teria que adaptar o <p:ajax> somente.

A

Jamir,

Obrigado pela ideia, vou analisar e dar uma implementada,

abraço

C

Acredito que também seja possível implemetar essa rotina com JQuery.

Criado 12 de março de 2011
Ultima resposta 14 de mar. de 2011
Respostas 3
Participantes 3