Chamar método ao abrir modalPanel [RichFaces]

5 respostas
cs.santos0

Iai pessual,

estou usando o componente rich:modalPanel do richFaces, mas estou com um pequeno problema.

A situação é a seguinte: tenho um listagem de determinados registros em um dataTable...e para cada registro tenho um botão...ao clicar nesse botão, é necessário abrir um modalPanel com algumas informações (é uma listagem de certificados digitais, então preciso mostrar algumas informações desse certificado)...ou seja, eu tenho um método no meu MB que faz a lógica de leitura do meu certificado (esta funcionando direitinho), e então depois de executar essa leitura, armazeno o resultado em uma string e essa string é mostrada no meu modalPanel...fiz uma implementação, e funciona meio estranho. Quando clico no botão q executa a lógica e chama o modalPanel, ele até abre, mas por uns 2 segundos e desaparece. E pelos 2 segundos que aparece da pra ver q esta funcionando corretamente. Eu só gostaria que ao clicar continuasse aberto meu modalPanel até eu fechar. Isso começou a ocorrer quando eu coloquei a action com a chamada do método de leitira do certificado no meu commandLink, segue o código:

método do MB (ainda será melhorado)

public String readAttest() {
        try {
            CertificadoDigital ce = this.getCertificadoDigitalFromList();
            ReadAttest ra = new ReadAttest();

            String path = this.getAppContext() + "\\" + ce.getCnpj() + ".p12";
            List<String> list = ra.read(path, ce.getSenha());
            
            if(list.isEmpty()){
                attestInfo = "Nenhuma Informação";
            }else{            
                attestInfo = list.get(0);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return "erro";
        }
        return "sucesso";
    }

no jsp dentro do dataTable:

<rich:column width="5%" style="text-align:center">
                            <f:facet name="header">
                                <h:outputText value="Detalhes" />
                            </f:facet>
                            <h:commandLink  styleClass="tdLink" action="#{certificadoDigitalBean.readAttest}" id="linkModal">
                                <h:outputText value="Detalhes" />
                                <rich:componentControl for="panelModal" attachTo="linkModal" operation="show" event="onclick"/>
                            </h:commandLink>
                        </rich:column>

dentro do jsp meu modalPanel:

<rich:modalPanel id="panelModal" width="350" height="100">
                    <f:facet name="header">
                        <h:panelGroup>
                            <h:outputText value="Detalhes do Certificado Digital"></h:outputText>
                        </h:panelGroup>
                    </f:facet>
                    <f:facet name="controls">
                        <h:panelGroup>
                            <h:graphicImage value="/images/close.png" style="cursor:pointer" id="hidelink"/>
                            <rich:componentControl for="panelModal" attachTo="hidelink" operation="hide" event="onclick"/>
                        </h:panelGroup>
                    </f:facet>
                    <h:outputText value="#{certificadoDigitalBean.attestInfo}"></h:outputText>
                </rich:modalPanel>

o modalPanel e o método creio q estejam certos, oq eu acho q precisa fazer de outro jeito é a chamada do método para carregar a leitura do arqquivo...

alguem pode me dar uma força?
vlw

5 Respostas

J

Olá,

O que me parece é que como vc está usando um h:commandLink, a página está sendo submetida para disparar a action e ao mesmo tempo vc está abrindo o modalPanel.

Sugiro o seguinte, substitua o seu h:commandLink para um a4j:commandLink, mais ou menos assim:

<a4j:commandLink action="#{certificadoDigitalBean.readAttest}" oncomplete=“Richfaces.showModalPanel(panelModal);”/>

A idéia aqui é quando a ação, invocada via ajax , for finalizada o modalPanel será exibido. Isto deve resolver mas como agora vc estará utilizando ajax poderá ter alguns efeitos colaterais no restante da tela (geralmente são fáceis de resolver).

cs.santos0

vlw a ajuda ai....

eu substitui o commandLink como vc indicou:

<a4j:commandLink value="Detalhes" action="#{certificadoDigitalBean.readAttest}"
                                            oncomplete="javascript:Richfaces.showModalPanel('panelModal')"/>

porem agora não mostra a informação no meu modalPanel...ele aparece, mantem aberto (como é esperado), mas não mostra...

public String readAttest() {
        try {
            CertificadoDigital ce = this.getCertificadoDigitalFromList();
            ReadAttest ra = new ReadAttest();

            String path = this.getAppContext() + "\\" + ce.getCnpj() + ".p12";
            List<String> list = ra.read(path, ce.getSenha());
            
            if(list.isEmpty()){
                this.setAttestInfo("Nenhuma Informação");
                System.out.println(attestInfo);
            }else{            
                this.setAttestInfo(list.get(0));
                System.out.println(attestInfo);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return "erro";
        }
        return "sucesso";
    }

e o método esta retornando corretamente...pois o System.out imprime o valor esperado....

alguem sabe oq pode ser?...será q tem algo a ver com o scope do MB...q por sinal esta session...pq aparentemente ele chama o método, seta o valor na variavel, porem ele limpa o valor da variavel de alguma forma q eu desconheço....

alguem pode dar uma força?
vlw

J

Olá,

Tem que mandar re-renderizar o modal panel, tente o seguinte:

<a4j:commandLink value="Detalhes" action="#{certificadoDigitalBean.readAttest}"  
                                           oncomplete="javascript:Richfaces.showModalPanel('panelModal')" reRender="panelModal" />
cs.santos0

vlw amigo…

acabei de resolver o problema…era exatamente isso, precisava renderizar…ja ia postar aki…rsrs

mas vlw a ajuda

jcmird

Essa dica é boa mesmo … Parabens !!! Me ajudou aqui tb =)

Criado 28 de outubro de 2008
Ultima resposta 14 de dez. de 2009
Respostas 5
Participantes 3