2012-03-28 2 views
2

У меня есть страница с диалоговым окном, в котором пользователь может добавить проект. Я хочу, чтобы сообщения об ошибках проверки на стороне сервера отображались в теге p: message, но если проверка прошла, я хочу, чтобы сообщение об успешном завершении отображалось в теге p: growl и закрытии диалога.Предисловие пытается добавить сообщение p: для ошибок проверки и p: growl для сообщений об успешном завершении

Как я могу это достичь? В настоящее время я могу получить все сообщения (ошибки или успехи), которые будут отображаться либо во всех p: growl, all p: messages, либо в обоих.

<p:growl id="growl" showDetail="true" life="3000" autoUpdate="false" /> 

<p:dialog id="projectsDialog" header="Add Project" widgetVar="projectsDialog" modal="true"> 

    <p:messages id="messages" autoUpdate="false" showDetail="true" /> 

    <h:form> 

     <h:outputLabel for="investigator" value="Investigator" /> 
     <p:selectOneMenu value="#{ppBacker.investigatorKey}" id="investigator" size="1" styleClass="listBoxMedium" > 
     <f:selectItems value="#{ppBacker.investigators}" /> 
     </p:selectOneMenu>    

     <h:outputLabel for="startDate" value="Start Date" /> 
     <p:calendar value="#{ppBacker.startDate}" id="startDate" mode="popup" navigator="true" required="true" requiredMessage="Start Date is required" />      

     <h:outputLabel for="endDate" value="End Date" /> 
     <p:calendar value="#{ppBacker.endDate}" id="endDate" mode="popup" navigator="true" required="true" requiredMessage="End Date is required" /> 

     <p:commandButton value="Add Project" id="s1Btn" type="submit" oncomplete="handleLoginRequest(xhr, status, args)" actionListener="#{ppBacker.addProject}" update=":growl"> 
     <f:setPropertyActionListener target="#{ppBacker.grantKey}" value="#{ppBacker.grantKey}" /> 
     </p:commandButton>   

     <!-- this jquery closes the add project dialog if the server side validation is successful --> 
     <script type="text/javascript"> 
     function handleLoginRequest(xhr, status, args) { 
      console.log('args.success = '+args.success); 
      console.log('args.validationFaile = '+args.validationFailed); 
       if(args.validationFailed || !args.success) { 
        jQuery('#projectsDialog').effect("shake", { times:1 }, 100); 
      } else { 
       projectsDialog.hide(); 

      } 
     } 
    </script> 

    </h:form> 

Мой метод ppBacker.addProject

public void addProject(){ 

    RequestContext context = RequestContext.getCurrentInstance(); 
     FacesMessage msg = null; 
     boolean success = false; 

     // validate the investigator, start date, and end date are set 
     if(!getProject().getInvestigatorKey().equals("0") && getProject().getStartDate() != null && getProject().getStartDate() != null) { 
      success = true; 
     msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Project Added Successfully", ""); 

     } else { 
      success = false;  
      msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Failed", "Investigator, Start Date, and End Date are required"); 

     } 

     System.out.println("success = "+success); 
     // I'M GUESSING THAT I CAN SOMEHOW USE THE FIRST PARAMETER OF THIS TO ATTACH MY MESSAGE, BUT I'M NOT SURE 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
     context.addCallbackParam("success", success); 

} 
+0

не совсем то, что вы ищете ... но ... взгляните на этот ответ ... stackoverflow.com/a/8634383/617373 – Daniel

ответ

1

, чтобы использовать функцию "globalOnly". По вызову FacesContext#addMessage() вызовите все сообщения об ошибках без идентификатора клиента null (например, одного из входного компонента или компонента кнопки или даже компонента формы) и сообщите всем сообщениям об успешном завершении идентификатор клиента null.

Таким образом, вы можете уйти с:

<p:messages ... globalOnly="false" /> 
<p:growl ... globalOnly="true" /> 

Альтернатива полагаться на #{facesContext.validationFailed} в атрибуте rendered. При добавлении вручную сообщения об ошибке вызовите FacesContext#validationFailed().

if (error) { 
    context.addMessage(null, errorMessage); 
    context.validationFailed(); 
} else { 
    context.addMessage(null, successMessage); 
} 
Смежные вопросы