Pessoal, estou com o seguinte problema.
Tenho na minha pagina o seguinte componente:
<h:selectOneMenu style="font-size:9pt; font-family: Arial">
<f:selectItem itemLabel="Filtrar" itemValue="1" />
<f:selectItem itemLabel="Inserir" itemValue="2" />
<f:selectItem itemLabel="Alterar" itemValue="3" />
<f:selectItem itemLabel="Remover" itemValue="4" />
</h:selectOneMenu>
Ele representa as operações de um CRUD, como vcs podem ver.
Tenho também os campos da tela, alguns deles devem ser obrigatórios quando o usuário selecionar a operação Inserir.
Se o usuário selecionar a operação Filtrar, por exemplo, TODOS os atributos da tela devem ser não-obrigatórios.
Pergunta chave: Alguém sabe como deixar o required=“true” dinâmico ? Pq ele as veses precisa ser false.
Só pra exemplificar:
<h:outputLabel value="Nome:" style="float: right;" />
<h:inputText label="Nome" value="#{peopleBean.name}" size="30" maxlength="70" required="true" id="name">
<f:validateLength minimum="3" />
</h:inputText>
O campo nome é obrigatório em todas as operações CRUD selecionadas, mas quero que seja obrigatório apenas qndo o usuario selecionar o Inserir.
Vejo 2 formas de você fazer isso:
1-Deixando o required atrelado a um atributo booleano no seu ManagedBean, e alterando ele conforme a seleção do combobox ( da para pegar por ajax o evento e renderizar novamente o campo necessário). Não tenho certeza se isso vai funcionar, não fiz algo do tipo, mas na teoria deve dar.
2-Retirar o required e fazer a validação no ManagedBean(eu prefiro essa abordagem). Você faz a validação programaticamente na sua classe, e depois retorna pra tela o que deve, como por exemplo a informação de dados faltando, ou o sucesso na execução da ação. Lembrando que caso seja duvida como acessar os messages para informar as mensagens de erro, com os estilos corretos, só dar uma estudada na api do JSF que tem isso facil e explicado.
Espero ter ajudado.
Pessoal consegui resolver o problema, segue a solução para quem tiver o mesmo problema:
Adicionei no meu combobox um listener que atualiza uma variavel chamada mandatory de acordo com a operação selecionada
<h:selectOneMenu style="font-size:9pt; font-family: Arial" value="#{peopleBean.operation}">
<f:selectItem itemLabel="Filtrar" itemValue="1" />
<f:selectItem itemLabel="Inserir" itemValue="2" />
<f:selectItem itemLabel="Alterar" itemValue="3" />
<f:selectItem itemLabel="Remover" itemValue="4" />
<f:ajax event="change" listener="#{peopleBean.refreshMandatory()}"/>
</h:selectOneMenu>
E tive que anotar minha manageBean com @ViewScoped que mantém meu manage bean enquanto nao mudo de pagina
@ViewScoped
@ManagedBean(name="peopleBean")
public class PeopleBean{
boolean mandatory = false;
...