Dialog não permite o uso de outro controle

8 respostas
E

Bom dia,

A configuração do projeto: Primefaces 5.0, JSF 2.2 e JPA 2.1.

Tenho o CRUD cidade. Quando executo o CREATE de cidade, permito ao meu usuário a inserção de novos estados de outros países, juntamente com sua sigla, certo. Estou com o seguinte problema: Quando clico no botão Novo Estado' o mesmo abre o componente dialog, mas não apresenta os campos.

Algumas soluções utilizadas sem sucesso:
- Retirar o botão 'Novo Estado' de dentro do componente PainelGrid na qual se realiza o rendered do Dialog 'Nova Cidade'.
- Retirar o rendered do componente PainelGrid do componente Dialog 'Novo Estado'.

Dialog "Novo Cidade":
<p:dialog id="CidadeCreateDlg" widgetVar="CidadeCreateDialog" closeOnEscape="true" modal="true" appendTo="@(body)" header="#{bundle.titleDialogNew} #{bundle.cityText}">
            <f:view>
                <h:form id="CidadeCreateForm">                  
                    <h:panelGroup id="display">
                        
                        <p:messages id="mensagens" showDetail="true" autoUpdate="true" closable="true"/>
                        <h:outputText value="* campo obrigatório."/>
                        <p:panelGrid rendered="#{cidadeControle.selecionado != null}">
                            <p:row>
                                <p:column>
                                    <p:outputLabel value="#{bundle.countryText}" for="cmbPais"/>
                                </p:column>
                                <p:column colspan="2">
                                    <p:selectOneMenu id="cmbPais"
                                                     required="true">
                                        <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/>
                                        <f:selectItems value="#{paisControle.itens}"
                                               var="country"
                                               itemLabel="#{country.pais}"
                                               itemValue="#{country}"/>
                                    </p:selectOneMenu>
                                    <p:message for="cmbPais"/>
                                </p:column>
                            </p:row>
                            <p:row>
                                <p:column>
                                    <p:outputLabel value="#{bundle.stateText}" for="cmbEstado"/>
                                </p:column>
                                <p:column>
                                    <p:selectOneMenu id="cmbEstado" 
                                             value="#{cidadeControle.selecionado.codigoEstado}"
                                             required="true"
                                             requiredMessage="#{bundle.stateText}: #{bundle.errorMessageValidationField}">
                                        <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/>
                                        <f:selectItems value="#{estadoControle.itens}"
                                               var="state"
                                               itemLabel="#{state.estado}"
                                               itemValue="#{state}"/>
                                    </p:selectOneMenu>
                                </p:column>
                                <p:column>
                                    <p:commandButton id="#{bundle.buttonNameNew}" title="#{bundle.buttonTitleNew} #{bundle.stateText}"    icon="ui-icon-plus" update=":EstadoCreateForm" oncomplete="PF('EstadoCreateDialog').show();" actionListener="#{estadoControle.prepararCriar}"/>
                                </p:column>
                            </p:row>
                            <p:row>
                                <p:column>
                                    <p:outputLabel value="CEP" for="txtCep"/> 
                                </p:column>
                                <p:column colspan="2">
                                    <p:inputMask id="txtCep" mask="99.999-999" value="#{cidadeControle.selecionado.cep}" title="#{bundle.cityTextPostalCode}" required="true"/>
                                </p:column>
                            </p:row>
                            <p:row>
                                <p:column>
                                    <p:outputLabel value="#{bundle.cityText}" for="txtCidade"/>
                                </p:column>
                                <p:column colspan="2">
                                    <p:inputText id="txtCidade" value="#{cidadeControle.selecionado.cidade}" title="#{bundle.cityText}"  required="true" requiredMessage="#{bundle.cityText}: #{bundle.errorMessageValidationField}"/>
                                </p:column>
                            </p:row>
                            <p:row>
                                <p:column>
                                    <p:outputLabel value="#{bundle.cityTextCitizenship}" for="txtNaturalidade"/>
                                </p:column>
                                <p:column colspan="2">
                                    <p:inputText id="txtNaturalidade" value="#{cidadeControle.selecionado.naturalidade}" title="#{bundle.cityTextCitizenship}" required="true"/>
                                </p:column>
                            </p:row>
                        </p:panelGrid>
                        <p:commandButton id="#{bundle.buttonNameSave}" value="#{bundle.buttonTitleSave}" icon="ui-icon-disk" actionListener="#{cidadeControle.criar}" update="display,:CidadeListForm:datalist" oncomplete="handleSubmit(args,'CidadeCreateDialog')"/>
                        <p:commandButton id="#{bundle.buttonNameCancel}" value="#{bundle.buttonTitleCancel}" icon="ui-icon-cancel" actionListener="#{cidadeControle.cancelar}" oncomplete="PF('CidadeCreateDialog').hide();"/>
                    </h:panelGroup>
                </h:form>
            </f:view>
        </p:dialog>
Na Linha 42 se encontra o botão, na qual abre-se o dialog abaixo. Dialog "Novo Estado":
<p:dialog id="EstadoCreateDlg" widgetVar="EstadoCreateDialog" closeOnEscape="true" modal="true" appendTo="@(body)" header="#{bundle.titleDialogNew} #{bundle.stateText}">
            <f:view>
                <h:form id="EstadoCreateForm">                  
                    <h:panelGroup id="display">
                        <p:messages for="mensagens"/>
                        <h:outputText value="* campo obrigatório."/>
                        <p:panelGrid columns="2" rendered="#{estadoControle.selecionado!=null}">
                            <p:outputLabel value="#{bundle.countryText}" for="cmbPais"/>
                            <p:selectOneMenu id="cmbPais"
                                             value="#{estadoControle.selecionado.codigoPais}"
                                             required="true"
                                             requiredMessage="#{bundle.countryText}: #{bundle.errorMessageValidationField}">
                                <f:selectItem itemLabel="#{bundle.comboboxSelectText}" itemValue=""/>
                                <f:selectItems value="#{paisControle.itens}"
                                               var="country"
                                               itemLabel="#{country.pais}"
                                               itemValue="#{country}"/>
                            </p:selectOneMenu>
                            <p:outputLabel value="#{bundle.stateText}" for="txtEstado"/>
                            <p:inputText id="txtEstado" value="#{estadoControle.selecionado.estado}" title="#{bundle.stateText}" required="true" requiredMessage="#{bundle.cityTextCitizenship}: #{bundle.errorMessageValidationField}"/>
                            <p:outputLabel value="#{bundle.stateTextUF}" for="txtUF"/>
                            <p:inputMask mask="aa" id="txtUF" value="#{estadoControle.selecionado.uf}" title="#{bundle.stateTextUF}" required="true" requiredMessage="#{bundle.cityTextCitizenship}: #{bundle.errorMessageValidationField}"/>
                        </p:panelGrid>
                        <p:commandButton id="#{bundle.buttonNameSave}" value="#{bundle.buttonTitleSave}" icon="ui-icon-disk" actionListener="#{estadoControle.criar()}" update=":growl,:CidadeCreateForm:cmbEstado" oncomplete="handleSubmit(args,'EstadoCreateDialog')"/>
                        <p:commandButton id="#{bundle.buttonNameCancel}" value="#{bundle.buttonTitleCancel}" icon="ui-icon-cancel" actionListener="#{estadoControle.cancelar}" oncomplete="PF('EstadoCreateDialog').hide();"/>
                    </h:panelGroup>
                </h:form>
            </f:view>
        </p:dialog>

8 Respostas

E

Já tentou colocar o form antes do dialog?

E

Sim. Já foi tentado em outras soluções sem sucesso. Tenho uma leve impressão de que o objeto do controle estado, está retonando null ou nem está sendo instanciado, pois, está dentro do rendered do PainelGrid do Dialog "Novo Estado" na linha 7. Vou postar aqui o controle cidade.

@ManagedBean
@ViewScoped
public class CidadeControle extends AbstractControle implements Serializable{

/**
*Ocultado
*/
    
    /**
     * Atributo recebe o cidade selecionada
     * @see #selecionado
     */
    private Cidade selecionado;

    public CidadeControle() {
        
    }
    
    public Cidade getSelecionado() {
        return selecionado;
    }
    
    public void setSelecionado(Cidade selecionado) {
        this.selecionado = selecionado;
 
    }
/*
* Métodos ocultados.
*/
}

Controle Estado:

@ManagedBean
@ViewScoped
public class EstadoControle extends AbstractControle implements Serializable{

/**
*código ocultado
*/
    
    /**
     * Atributo recebe o estado selecionada
     * @see #selecionado
     */
    private Estado selecionado;

    public EstadoControle() {
    }
    
    /**
     * Método retorna o objeta da entity.
     * @return Estado Entity
     */
    public Estado getSelecionado() {
        return selecionado;
    }
    
    public void setSelecionado(Estado selecionado) {
        this.selecionado = selecionado;
    }

/**
* Métodos ocultados
*/
}

Será que é isso?

E

E a sua classe Bean?

E

São essas!

E

Está um pouco confuso o que vc ta mostrando(pelo menos pra mim rs), mostra esse bean todo jovem!

por exemplo

value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle é o Bean, selecionado é o objeto, esse objeto tem que vir preenchido(nem que seja tudo nulo), se o que tem no teu Bean é isso, não tem nada instanciando esse objeto…

E
Eiro:
Está um pouco confuso o que vc ta mostrando(pelo menos pra mim rs), mostra esse bean todo jovem!

por exemplo

value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle é o Bean, selecionado é o objeto, esse objeto tem que vir preenchido(nem que seja tudo nulo), se o que tem no teu Bean é isso, não tem nada instanciando esse objeto...

Desculpa ai, abaixo os beans completos
@ManagedBean
@ViewScoped
public class EstadoControle extends AbstractControle implements Serializable{
    /**
     * Atributo recebe o EJB EstadoFacade
     * @see #facade
     */
    @EJB
    private EstadoFacade facade;
    
    /**
     * Atributo recebe a lista de relações
     * @see #itens
     */
    private List<Estado> itens = null;
    
    /**
     * Atributo recebe o estado selecionada
     * @see #selecionado
     */
    private Estado selecionado;

    public EstadoControle() {
    }
    
    /**
     * Método retorna o objeta da entity.
     * @return Estado Entity
     */
    public Estado getSelecionado() {
        return selecionado;
    }
    
    public void setSelecionado(Estado selecionado) {
        this.selecionado = selecionado;
    }
    
    protected void setChavesIncoporaveis(){
        
    }
    
    protected void inicializarChaveIncorporavel(){
        
    }
    
    public EstadoFacade getFacade() {
        return facade;
    }
    
    public Estado prepararCriar(){
        selecionado = new Estado();
        inicializarChaveIncorporavel();
        return selecionado;
    }
    
    public void criar(){
        persistir(PersistirAcao.CRIAR, getMensagemAgrupada("sucessMessageCreate"));
        if (!ehFalhaValidacao()) {
            itens = null; //Invalida a lista de itens e evita a re-query.
        }
    }
    
    public void alterar(){
        persistir(PersistirAcao.ATUALIZAR, getMensagemAgrupada("sucessMessageChange"));
    }
    
    public void destruir(){
        persistir(PersistirAcao.EXCLUIR, getMensagemAgrupada("sucessMessageDelete"));
        if (!ehFalhaValidacao()) {
            selecionado = null; //Remove a seleção
            itens = null; //Invalida a lista de itens e evita a re-query.
        }
    }
    
    public void cancelar(){
        selecionado = null;
    }
    
    public Estado getEstado(Long id){
        return getFacade().encontrar(id);
    }
    
    public List<Estado> getItens(){
        if (itens == null) {
            itens = getFacade().encontrarTudo();
        }
        return itens;
    }
    
    public List<Estado> getSelecionarMuitosItensDisponiveis(){
        return getFacade().encontrarTudo();
    }
    
    public List<Estado> getSelecionarUmItensDisponiveis(){
        return getFacade().encontrarTudo();
    }
    
    private void persistir(PersistirAcao persistirAcao, String mensagemSucesso){
        if (selecionado != null) {
            setChavesIncoporaveis();
            try{
                if (persistirAcao != PersistirAcao.EXCLUIR) {
                    getFacade().alterar(selecionado);
                }else{
                    getFacade().excluir(selecionado);
                }
                adicionarMensagemSucesso(mensagemSucesso);
            }catch(EJBException excecao){
                String mensagem = "";
                Throwable causa = excecao.getCause();
                if (causa == null) {
                    mensagem = causa.getLocalizedMessage();
                }
                if (mensagem.length() > 0) {
                    adicionarMensagemErro(mensagem);
                } else {
                    adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));                    
                }
            }catch(PersistenceException pe){
                //if(pe.getMessage().contains("ConstraintViolationException"))
                                    adicionarMensagemErro(pe, pe.getMessage());
            }catch (Exception excecao) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,null,excecao);
                adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));
            }
        }
    }
}
@ManagedBean
@ViewScoped
public class CidadeControle extends AbstractControle implements Serializable{
    /**
     * Atributo recebe o EJB CidadeFacade
     * @see #facade
     */
    @EJB
    private CidadeFacade facade;
    
    /**
     * Atributo recebe a lista de relações
     * @see #itens
     */
    private List<Cidade> itens = null;
    
    
    private List<Cidade> filtros;
    
    /**
     * Atributo recebe o cidade selecionada
     * @see #selecionado
     */
    private Cidade selecionado;

    public CidadeControle() {
        
    }
    
    public Cidade getSelecionado() {
        return selecionado;
    }
    
    public void setSelecionado(Cidade selecionado) {
        this.selecionado = selecionado;
    }
   
    protected void setChavesIncoporaveis(){
        
    }
    
    protected void inicializarChaveIncorporavel(){
        
    }
    
    public CidadeFacade getFacade() {
        return facade;
    }
    
    public List<Cidade> getCidadeFiltrada(){
        return filtros;
    }
    
    public void setCidadeFiltrada(List<Cidade> filtradas){
        this.filtros = filtradas;
    }
    
    public Cidade prepararCriar(){
        selecionado = new Cidade();
        inicializarChaveIncorporavel();
        return selecionado;
    }
    
    public void criar(){
        persistir(PersistirAcao.CRIAR, getMensagemAgrupada("sucessMessageCreate"));
        if (!ehFalhaValidacao()) {
            itens = null; //Invalida a lista de itens e evita a re-query.
        }
    }
    
    public void alterar(){
        
        persistir(PersistirAcao.ATUALIZAR, getMensagemAgrupada("sucessMessageChange"));
    }
    
    public void destruir(){
        persistir(PersistirAcao.EXCLUIR, getMensagemAgrupada("sucessMessageDelete"));
        if (!ehFalhaValidacao()) {
            selecionado = null; //Remove a seleção
            itens = null; //Invalida a lista de itens e evita a re-query.
        }
    }
    
    public void cancelar(){
        selecionado = null;
    }
    
    public Cidade getCidade(Long id){
        return getFacade().encontrar(id);
    }
    
    public List<Cidade> getItens(){
        if (itens == null) {
            itens = getFacade().encontrarTudo();
        }
        return itens;
    }
    
    public List<Cidade> getSelecionarMuitosItensDisponiveis(){
        return getFacade().encontrarTudo();
    }
    
    public List<Cidade> getSelecionarUmItensDisponiveis(){
        return getFacade().encontrarTudo();
    }
    
    private void persistir(PersistirAcao persistirAcao, String mensagemSucesso){
        if (selecionado != null) {
            setChavesIncoporaveis();
            try{
                if (persistirAcao == PersistirAcao.CRIAR) {
                    getFacade().criar(selecionado);
                }else if(persistirAcao == PersistirAcao.ATUALIZAR){
                    getFacade().alterar(selecionado);
                }else if(persistirAcao == PersistirAcao.EXCLUIR){
                    getFacade().excluir(selecionado.getCodigoCidade());
                }
                adicionarMensagemSucesso(mensagemSucesso);
            }catch(EJBException excecao){
                String mensagem = "";
                Throwable causa = excecao.getCause();
                if (causa == null) {
                    mensagem = causa.getLocalizedMessage();
                }
                if (mensagem.length() > 0) {
                    adicionarMensagemErro(mensagem);
                } else {
                    adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));                    
                }
            }catch(PersistenceException pe){
                //if(pe.getMessage().contains("ConstraintViolationException"))
                                    adicionarMensagemErro(pe, pe.getMessage());
            }catch (Exception excecao) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,null,excecao);
                adicionarMensagemErro(excecao, getMensagemAgrupada("errorMessagePersistence"));
            }
        }
    }
}

Abaixo está buscar.xhtml, onde tem os botões para acesso ao dialog "Nova Cidade" pelo um commandButton.

<ui:composition template="/home.xhtml">
        <ui:define name="conteudo">
            <h:form id="CidadeListForm">
                <p:panel header="#{bundle.pageTitleSearch}">
                    <p:dataTable id="datalist"
                                 widgetVar="citysTable"
                                 value="#{cidadeControle.itens}" 
                                 var="item"
                                 emptyMessage="#{bundle.messageWarningNoRecordFound}"
                                 selectionMode="single" 
                                 selection="#{cidadeControle.selecionado}"
                                 paginator="true" 
                                 rowKey="#{item.codigoCidade}" 
                                 rows="10"
                                 rowsPerPageTemplate="5,10,20,30,40,50"
                                 filteredValue="#{cidadeControle.cidadeFiltrada}"
                                 >
                        
                        <p:ajax event="rowSelect"   update="btnNovo btnAlterar  btnVisualizar btnExcluir"/>
                        <p:ajax event="rowUnselect" update="btnNovo btnAlterar  btnVisualizar btnExcluir"/>

                        <p:column headerText="#{bundle.cityTextPostalCode}">
                            <h:outputText value="#{item.cep}"/>
                        </p:column>
                        <p:column headerText="#{bundle.cityText}" filterBy="#{item.cidade}" filterMatchMode="contains">
                            <h:outputText value="#{item.cidade}"/>
                        </p:column>
                        <p:column headerText="#{bundle.stateTextUF}">
                            <h:outputText value="#{item.codigoEstado.uf}"/>
                        </p:column>
                        <f:facet name="footer">
                            <p:commandButton id="#{bundle.buttonNameNew}"    icon="ui-icon-plus" value="#{bundle.buttonTitleNew}" update=":CidadeCreateForm" oncomplete="PF('CidadeCreateDialog').show();" actionListener="#{cidadeControle.prepararCriar}"/>
                            <p:commandButton id="#{bundle.buttonNameChange}" icon="ui-icon-pencil" value="#{bundle.buttonTitleChange}" update=":CidadeEditForm" oncomplete="PF('CidadeEditDialog').show();" disabled="#{empty cidadeControle.selecionado}"/>
                            <p:commandButton id="#{bundle.buttonNameView}"   icon="ui-icon-search" value="#{bundle.buttonTitleView}" update=":CidadeViewForm" oncomplete="PF('CidadeViewDialog').show();" disabled="#{empty cidadeControle.selecionado}"/>
                            <p:commandButton id="#{bundle.buttonNameDelete}" icon="ui-icon-trash" value="#{bundle.buttonTitleDelete}" update=":growl,datalist" actionListener="#{cidadeControle.destruir}" disabled="#{empty cidadeControle.selecionado}">
                                <p:confirm header="Aviso" message="#{bundle.messageWarningConfirmationDelete}" icon="ui-icon-alert"/>
                            </p:commandButton>
                        </f:facet>
                    </p:dataTable>
                </p:panel>
            </h:form>
            <ui:include src="criar.xhtml"/>
            <ui:include src="alterar.xhtml"/>
            <ui:include src="visualizar.xhtml"/>
            <ui:include src="../../estrutura/mensagens/mensagens.xhtml"/>
        </ui:define>
    </ui:composition>
E

o que vc ta chamando na tela, ele tem que chamar no bean também.

por exemplo: value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle tem que ter o get/set no bean para ele poder pegar e setar, e logicamente, tem que estar estanciado.

E

Eiro:
o que vc ta chamando na tela, ele tem que chamar no bean também.

por exemplo: value="#{cidadeControle.selecionado.codigoEstado}"

cidadeControle tem que ter o get/set no bean para ele poder pegar e setar, e logicamente, tem que estar estanciado.

Não, entendi bem o que você quis dizer?

Criado 14 de novembro de 2014
Ultima resposta 17 de nov. de 2014
Respostas 8
Participantes 2