Rendered em selectItem

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… :frowning:

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>