I'm using <p:dialog>
. After submitting the form therein, I use dialog.hide()
and it fires the ajax close event listener method which will update a List<E>
.
It was working properly, but when I put some required input components and bring the <p:dialog>
again if there is some validation error, it doens't fire the method anymore.
The dialog:
<p:outputPanel autoUpdate="true">
<p:dialog id="dialogComentario" header="Deixe sua avaliação" widgetVar="confirmation"
showEffect="fade" hideEffect="fade" height="340" width="500" modal="true"
visible="#{not empty facesContext.maximumSeverity}"
resizable="false" closable="true" draggable="false">
<h:form prependId="false">
...
<p:commandLink styleClass="btn btn-primary btenviacoment"
oncomplete="if (!args.validationFailed) confirmation.hide();"
actionListener="#{comentario.actEnviarComentario}" global="false">
<i class=" icon-play-circle icon-white"></i>
<h:outputText value=" Enviar Comentário" />
<f:param name="codigoplu" value="#{produto.produto.codigoplu}" />
</p:commandLink>
...
<p:commandLink styleClass="btn" onclick="confirmation.hide();"
global="false" immediate="true">
<h:outputText value=" Cancelar" />
<i class="icon-off"></i>
</p:commandLink>
...
</h:form>
<p:ajax event="close" update=":avaliacoesClientes, :dialogComment"
listener="#{produto.atualizarComentarios}" global="false" />
</p:dialog>
</p:outputPanel>
The action listener method:
public void actEnviarComentario(ActionEvent event) {
String codigoplu = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("codigoplu");
PegarDadosCliente();
try {
DateFormat f = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date utildata = new java.util.Date();
utildata = (java.util.Date) f.parse(String.valueOf(data.getValue()));
java.sql.Date datasql = new java.sql.Date(utildata.getTime());
Comentario comentario = new Comentario(Integer.parseInt(usuario.getId()), Integer.parseInt(codigoplu), titulo.getValue().toString(), mensagem.getValue().toString(), datasql, Integer.parseInt(rating.getValue().toString()), new java.sql.Date(new Date().getTime()));
listavelComentarios.inserirComentario(comentario);
RequestContext.getCurrentInstance().execute("confirmation.hide();");
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
I tried to close the dialog with RequestContext
as shown in action method, but that won't fire the ajax close event either.
Here's the ajax close event listener method:
public void atualizarComentarios(CloseEvent event) {
try {
comentarios = comentario.listarComentarios(codigoplu);
if (comentarios.size() > 0) {
msgAvaliacao = "Avaliação do produto.";
int votos = 0;
for (Comentario comentario : comentarios) {
votos += comentario.getAvaliacao();
}
rating = votos / comentarios.size();
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
This problem is not related to validation. Remove all those input components and press the command button/link and you'll see that it's still not fired.
This problem is caused by the unnecessary combination of <p:outputPanel autoUpdate="true">
and visible="#{not empty facesContext.maximumSeverity}"
. The output panel keeps auto-updating the dialog which apparently forces you to set the visible
attribute like that. The dialog is auto-updated right before the oncomplete
event is fired. If the dialog visible
property is false
, then the dialog is already hidden (invisible) before the oncomplete
is fired.
So, just get rid of the <p:outputPanel>
and the visible
attribute. Your oncomplete
already does the right job.
Unrelated to the concrete problem, the RequestContext
line is unnecessary. You're already hiding it in oncomplete
which is perfectly fine. See also Keep p:dialog open when a validation error occurs after submit.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With