Search code examples
jsfprimefacesmessageconfirm

Update bean message value before displaying it in a <p:confirmDialog>


Can anyone tell me how do I change the message of <p: confirm>? When you click the button I want the message of value to be returned by the messageCount () method.

...

<p:outputLabel value="Test:" />                        
<p:inputText value="#{testController.fieldTest}" id="fieldTest"/>

...

<p:commandButton value="Ok" action="#{testController.cadTest()}">
    <p:confirm id="messageConfirm" header="Test" />
</p:commandButton>

...

<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
    <f:facet name="message">
        <p:outputPanel>
            <h:outputFormat id="message" value="#{testController.mensagemConfirm}" escape="false"/>
        </p:outputPanel>
    </f:facet>
    <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
    <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
</p:confirmDialog>

...


//TestController

private String mensagemConfirm;
private Integer count = 0;


public Integer messageCount() {
    return count++;
}

public String getMensagemConfirm() {
    setMessageConfirm("Count: " + messageCount());
    return mensagemConfirm;
}

public void setMensagemConfirm(String mensagemConfirm) {
    this.mensagemConfirm = mensagemConfirm;
}

Example:

  • First Click the "Ok" (<p:commandButton>)

    -> message of confirmDialog: Count: 1 (click in "No")

  • Secound Click the "Ok" (<p:commandButton>)

    -> message of confirmDialog: Count: 2 (click in "No")

  • Third Click the "Ok" (<p:commandButton>)

    -> message of confirmDialog: Count: 3 (click in "No")


Solution

  • The problem here is that the p:confirm will not execute your server side code until you press "yes" in the confirmDialog. So you have to do something in order to execute the server side code first, and show the confirm dialog after the ajax request has been completed.

    You can do it by showing the confirm dialog with the oncomplete attribute:

        <p:commandButton value="Ok" update="conf" action="#{testController.increaseCount()}" oncomplete="PF('confirmVar').show()"/>
    
        <p:confirmDialog id="conf" global="true" showEffect="fade" hideEffect="fade" widgetVar="confirmVar">
    
            <p:commandButton value="Yes" action="#{testController.cadTest()}" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" oncomplete="PF('confirmVar').hide()"/>
            <p:commandButton value="No" styleClass="ui-confirmdialog-no" icon="ui-icon-close" oncomplete="PF('confirmVar').hide()"/>
    
            <f:facet name="message">
                <p:outputPanel>
                    <h:outputFormat value="Count: #{testController.count}" escape="false"/>
                </p:outputPanel>
            </f:facet>
        </p:confirmDialog>
    

    Also its bad design to execute application logic code in pure getters/setters. Use dedicated methods for that.

    testController bean:

    private int count;
    
    public int getCount() {
        return count;
    }
    
    public void setCount(int count) {
        this.count = count;
    }
    
    public void increaseCount() {
       count++;
    }