Bom dia galera, tudo certo ?? Bem, na minha aplicação estou querendo fazer o seguinte: tenho uma lista dois selectOneMenu (escola e turma). Daí que busco as turmas somente daquela escola.
No selectOneMenu de turmas, coloquei um <f:selectItem como default e depois um <f:selectItems com a lista das turmas daquela escola. Porém, eu queria fazer o seguinte: se a escola só tiver uma turma, queria que o <f:selectItem “desaparecesse” e viesse direto a ÚNICA TURMA. Queria fazer pelo tamanho da lista de turmas, no caso se ela fosse igual a 1… Até agora consegui somente desabilitar o <f:selectItem… Tentei utilizar o rendered, mas não está funcioando…Abaixo os dois selectOneMenu:
<td align="right">Escola: *</td>
<h:panelGrid columns="2">
<p:selectOneMenu id="escola" value="#{registroAulaJsfBean.crudObj.escola}" converter="sec" required="true" requiredMessage="O campo escola deve ser informado." filter="true" caseSensitive="false" filterMatchMode="contains">
<f:selectItem itemLabel="Selecione" itemValue="#{null}"/>
<f:selectItems value="#{registroAulaJsfBean.escolaList}" var="e" itemLabel="#{e.codigo} - #{e.nome}" itemValue="#{e}"/>
<f:ajax render="turma" event="change" listener="#{registroAulaJsfBean.atualizarTurmaPorEscola(event)}"/>
</p:selectOneMenu>
</h:panelGrid>
<td align="right">Turma: *</td>
<h:panelGrid columns="2">
<p:selectOneMenu id="turma" value="#{registroAulaJsfBean.crudObj.turma}" converter="sec" required="true" requiredMessage="O campo turma deve ser informado." filter="true" caseSensitive="false" filterMatchMode="contains">
<f:selectItem itemLabel="Selecione" itemValue="#{null}" itemDisabled="#{registroAulaJsfBean.turmaList.size() == 1}" />
<f:selectItems value="#{registroAulaJsfBean.turmaList}" var="t" itemLabel="#{t.codigo} - #{t.descricao}" itemValue="#{t}"/>
<p:ajax update="disciplinas periodo presenca_table" event="change" listener="#{registroAulaJsfBean.atualizarEtapa(event)}"/>
</p:selectOneMenu>
</h:panelGrid>
Se alguém puder ajudar, agradeço…Vlw
O jeito mais fácil é o seguinte:
1 - Crie o campo com a única turma, e o select com várias.
2 - Faça o método que diz se existe uma única turma
3 - Se tiver uma única turma, o campo único deve ser renderizado, e o select não. Se houverem várias turmas, deve ocorrer o inverso.
[quote=Rodrigo Sasaki]O jeito mais fácil é o seguinte:
1 - Crie o campo com a única turma, e o select com várias.
2 - Faça o método que diz se existe uma única turma
3 - Se tiver uma única turma, o campo único deve ser renderizado, e o select não. Se houverem várias turmas, deve ocorrer o inverso.[/quote]
Olá Rodrigo Sasaki, blz? Bem, desculpe, mas não entendi mto bem… Mas desse jeito que estou fazendo, não tem como fazer com que o selectItem “suma” ?? Tentei criar um booleano no meu bean, e testar, mas não tem jeito de funcionar o rendered…Poderia dar uma ajuda aí ?? Vlw…
mas o rendered faz justamente isso. Coloque fixamente um rendered=“false” no seu componente e carregue a página de novo, veja que ele não vai aparecer
Coloquei o rendered dessa maneira e não funciou… 
Alguém mais poderia dar uma ajuda aí? Estou tentando também utilizar o c:if , mas n está dando certo…abaixo o xhtml:
<td align="right">Turma: *</td>
<h:panelGrid columns="2">
<p:selectOneMenu id="turma" value="#{registroAulaJsfBean.crudObj.turma}" converter="sec" required="true" requiredMessage="O campo turma deve ser informado." filter="true" caseSensitive="false" filterMatchMode="contains">
<c:if test="#{registroAulaJsfBean.turmaList.size() == 1}">
<f:selectItem itemLabel="Selecione" itemValue="#{null}" />
</c:if>
<f:selectItems value="#{registroAulaJsfBean.turmaList}" var="t" itemLabel="#{t.codigo} - #{t.descricao}" itemValue="#{t}"/>
<p:ajax update="disciplinas periodo presenca_table" event="change" listener="#{registroAulaJsfBean.atualizarEtapa(event)}"/>
</p:selectOneMenu>
</h:panelGrid>
Se alguém puder ajudar, agradeço mto… Vlw
Olá Ricardo,
O que você pode tentar fazer é na hora que você buscar turmaList, você criar uma regra uma regra no método do seu bean da seguinte forma:
...
if (turmaList.size() == 1){
this.crudObj.turma = this.turmaList.get(0);
}
...
Porque você setando o atributo “value” do selectOneMenu com alguma valor, esse valor aparece como selecionado de cara quando a combo é renderizada, sem precisar usar o render para esconder a combo inteira ou só o selectItem.
Tenta lá e avisa para nós.
Um abraço
o rendered não é no f:selectItem, e sim no p:selectOneMenu
mas então como eu poderia fazer para que, quando tiver somente uma turma na lista, ela vir direto no selectOneMenu, e não ter que selecionar…??
Então, mas nesse caso você não vai ter como selecionar mais mesmo, pois a lista só tem um item , mas desse jeito,mesmo assim, vai ter a outra opção “Selecione”, só que agora na renderização já vai vir selecionada a turma que você setou (this.turmaList.get(0).
Posta aqui o método que popula (preenche) a “turmaLista” e coloca essas linhas de código dentro desse metodo e vê o que acontece:
...
if (turmaList.size() == 1){
this.crudObj.turma = this.turmaList.get(0);
}
...
[quote=gustavo_souza]Então, mas nesse caso você não vai ter como selecionar mais mesmo, pois a lista só tem um item , mas desse jeito,mesmo assim, vai ter a outra opção “Selecione”, só que agora na renderização já vai vir selecionada a turma que você setou (this.turmaList.get(0).
Posta aqui o método que popula (preenche) a “turmaLista” e coloca essas linhas de código dentro desse metodo e vê o que acontece:
[code]
…
if (turmaList.size() == 1){
this.crudObj.turma = this.turmaList.get(0);
}
…
[/code][/quote]
OK, no meu xhtml:
<td align="right">Escola: *</td>
<h:panelGrid columns="2">
<p:selectOneMenu id="escola" value="#{registroAulaJsfBean.crudObj.escola}" converter="sec" required="true" requiredMessage="O campo escola deve ser informado." filter="true" caseSensitive="false" filterMatchMode="contains">
<f:selectItem itemLabel="Selecione" itemValue="#{null}"/>
<f:selectItems value="#{registroAulaJsfBean.escolaList}" var="e" itemLabel="#{e.codigo} - #{e.nome}" itemValue="#{e}"/>
<f:ajax render="turma" event="change" listener="#{registroAulaJsfBean.atualizarTurmaPorEscola(event)}"/>
</p:selectOneMenu>
</h:panelGrid>
<td align="right">Turma: *</td>
<h:panelGrid columns="2">
<p:selectOneMenu id="turma" value="#{registroAulaJsfBean.crudObj.turma}" converter="sec" required="true" requiredMessage="O campo turma deve ser informado." filter="true" caseSensitive="false" filterMatchMode="contains">
<f:selectItem itemLabel="Selecione" itemValue="#{null}" />
<f:selectItems value="#{registroAulaJsfBean.turmaList}" var="t" itemLabel="#{t.codigo} - #{t.descricao}" itemValue="#{t}"/>
<p:ajax update="disciplinas periodo presenca_table" event="change" listener="#{registroAulaJsfBean.atualizarEtapa(event)}"/>
</p:selectOneMenu>
</h:panelGrid>
No meu bean:
public void atualizarTurmaPorEscola(AjaxBehaviorEvent event) {
if (crudObj.getEscola() != null) {
atualizarTurmaPorEscola(crudObj.getEscola().getCodigo().toString(), anoAtual);
}
}
private void atualizarTurmaPorEscola(String codigoEscola, Integer ano) {
if (codigoEscola != null && !codigoEscola.isEmpty()) {
if (isDocenteLogado) {
turmaList = ts.findTurmaByEscolaAnoDocente(codigoEscola, ano.toString(), JsfUtil.getCurrentUser());
} else {
turmaList = ts.findTurmaByEscolaAnoRegistroAula(codigoEscola, ano);
}
// if (turmaList.size() == 1) {
// tamanhoLista = true;
// }
} else {
turmaList.clear();
disciplinaList.clear();
tipoPeriodos.clear();
}
}
Só que não estou conseguindo colocar do jeito que vc falou…Poderia dar uma força ae?? Vlw…
Tenta isso,
...
<p:selectOneMenu id="turma" value="#{registroAulaJsfBean.turmaSelecionada}" ... >
....
public class RegistroAulaJsfBean{
private Turma turmaSelecionada;
private void atualizarTurmaPorEscola(String codigoEscola, Integer ano) {
if (codigoEscola != null && !codigoEscola.isEmpty()) {
if (isDocenteLogado) {
turmaList = ts.findTurmaByEscolaAnoDocente(codigoEscola, ano.toString(), JsfUtil.getCurrentUser());
} else {
turmaList = ts.findTurmaByEscolaAnoRegistroAula(codigoEscola, ano);
}
if (turmaList.size() == 1){
this.turmaSelecionada = this.turmaList.get(0);
}
} else {
turmaList.clear();
disciplinaList.clear();
tipoPeriodos.clear();
this.turmaSelecionada = null;
}
}
Bom dia galera, tudo certo ? Bem, ainda não consegui resolver o problema do rendered no selectItem… Não tem jeito de funcionar…Alguém saberia de alguma coisa que eu poderia fazer?? Vlw
[quote=gustavo_souza]Tenta isso,
[code]
…
<p:selectOneMenu id=“turma” value="#{registroAulaJsfBean.turmaSelecionada}" … >
…
public class RegistroAulaJsfBean{
private Turma turmaSelecionada;
private void atualizarTurmaPorEscola(String codigoEscola, Integer ano) {
if (codigoEscola != null && !codigoEscola.isEmpty()) {
if (isDocenteLogado) {
turmaList = ts.findTurmaByEscolaAnoDocente(codigoEscola, ano.toString(), JsfUtil.getCurrentUser());
} else {
turmaList = ts.findTurmaByEscolaAnoRegistroAula(codigoEscola, ano);
}
if (turmaList.size() == 1){
this.turmaSelecionada = this.turmaList.get(0);
}
} else {
turmaList.clear();
disciplinaList.clear();
tipoPeriodos.clear();
this.turmaSelecionada = null;
}
}
[/code][/quote]
Testei desse jeito e não tive sucesso…Tentei com <c:if, mas dá um erro de resetForm…Poderia dar uma ajuda ??? Vlw…
O rendered não é suportado no f:selectItem, o autocomplete das ide pode até trazer, mais não suporta.
(fonte : https://issues.apache.org/jira/browse/MYFACES-3609)
Solução, utilize o h:panelGroup com rendered sobre o f:selectItem.
Exemplo:
<h:panelGroup rendered="fasle">
<f:selectItem itemLabel="XXX" itemValue="XXX" />
</h:panelGroup>