Проверка PrimeFaces p: wizard не работает - PullRequest
5 голосов
/ 30 мая 2011

У меня есть p:wizard с некоторыми вкладками. На первой вкладке пользователь выбирает значение (t :selectOneRadio - я использую Томагавк). Это обязательное значение.

Если пользователь не выбрал значение, оно не перейдет на следующую вкладку, но ошибка проверки не отображается. Hm.

Если пользователь выбрал значение, переходит на следующую вкладку, возвращается на первую вкладку и выбирает другое значение, он будет вести себя так, как будто на этот раз значение не было выбрано. (Нет ошибки проверки, но вторая вкладка не может быть вызвана).

И еще хуже: пользователь выбирает значение на первой вкладке, переходит на вторую вкладку, пытается оттуда вызвать действие ... появляется сообщение проверки; он действует так, как будто на первой вкладке не было выбрано никакого значения.

Есть ли какое-либо объяснение этому?

UPDATE

Решение , предложенное на форуме PrimeFaces, сработало для меня. (Добавление process = "@ this" к кнопке command.)

Ответы [ 5 ]

4 голосов
/ 31 мая 2011

Еще одна вещь, которую вы можете рассмотреть.

Если у вас возникли проблемы с обязательными полями на вкладках, вы можете вручную выполнить свои собственные проверки между шагами, внедрив событие потока в свой компонент мастера.

    public String onFlowProcess(FlowEvent event) {  
    //First perform check to see if the user is attempting to remove the last visitor
    if ("confirm".equals(event.getNewStep()) && (visitors == null || visitors.isEmpty())) {
        log.debug("Validation failed for empty visitors");
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Visit must have at least one visitor.", null);
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return event.getOldStep();
    }

    return event.getNewStep();  
}

И в .xhtml файле я объявляю событие flowListener.Попробуйте это и посмотрите, исчезнут ли сообщения проверки.

<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true">
4 голосов
/ 31 мая 2011

UPDATE

Решение , предложенное на форуме PrimeFaces, сработало для меня. (Добавление process="@this" к commandButton.) Понятия не имею почему , хотя!

2 голосов
/ 31 мая 2011

Похоже, это может быть одной из нескольких возможных проблем.Возможно, вы получаете ошибку проверки, однако, возможно, вы неправильно объявили свой компонент сообщений или он не обновляется.В этом случае это могут быть ошибки проверки, которые вы просто не видите на странице.

Из руководства 2.2 Primefaces для компонента Wizard:

AJAX и PartialПроверки - переключение между шагами основано на ajax, что означает, что каждый шаг загружается динамически с помощью ajax.Частичная проверка также встроена, поэтому при нажатии кнопки «Далее» проверяется только текущий шаг. Если текущий шаг действителен, содержимое следующей вкладки загружается с помощью ajax.Проверки не выполняются, когда поток возвращается.

Другая проблема может заключаться в том, что ваше свойство не устанавливается должным образом в управляемом компоненте, и это вызывает проблемы проверки.Это кажется более вероятным.

У меня возникают проблемы с размышлениями, почему для selectOneRadio нужна проверка, отличная от 'Required'?У вас есть ограниченное количество вариантов, и один из них должен быть выбран, поэтому недопустимое или недопустимое значение не должно быть возможным.

1 голос
/ 26 сентября 2013

Вам просто нужно поставить атрибут true на вашей радиокнопке.

ex:

<p:selectOneRadio required="true" requiredMessage="you must put it">
    <f:selectItem itemLabel="Días Laborales" itemValue="diasLab" />
    <f:selectItem itemLabel="Días Ticados" itemValue="diasTic" />
</p:selectOneRadio>
0 голосов
/ 23 января 2014

PrimeFaces 'p: проблема с проверкой мастера

Шаг: 1 customerInformation.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">


 <p:wizard flowListener="#{customerForm.onFlowProcess}">  

       <p:tab id="information" title="Information">  
     <p:panel header="Customer Information"> 

        <h:outputLabel value="First Name" for="fName"/>
            <h:inputText id="fname" value="#{customer.fname}"/>                                                                                                                                             

            <h:outputLabel value="Last Name" for="lName"/>
            <h:inputText id="lname" value="#{customer.lname}"/>                                                             

         </panel>
       </p:tab>

         <p:tab id="details" title="Details">  
       <p:panel header="Customer Details">  

              <h:outputLabel value="Address Line 1" for="addressOne"/>
            <h:inputText id="addressOne" value="#{customer.addressOne}"/>                                                                                                                                               

            <h:outputLabel value="Address Line 2" for="addressTwo"/>
            <h:inputText id="addressTwo" value="#{customer.addressTwo}"/>   

           </panel>
       </p:tab>
  </p:wizard>
</html>

Шаг: 2 Создайте класс EJB CustomerForm.java

public class CustomerForm implements Serializable {

    private static final long serialVersionUID = 1L;

    private String fName;
    private String lName;
    private String addressOne;
    private String addressTwo;

    private static Logger logger = Logger.getLogger(CustomerForm.class.getName());                                         

    /**
     * Call this method in p:wizard tag
     * 
     */  
    public String onFlowProcess(FlowEvent event) {  
    logger.info("Current wizard step:" + event.getOldStep());  
    logger.info("Next step:" + event.getNewStep());  
        return event.getNewStep();  
    }

    /**
     * @return the fName
     */
    public String getfName() {
        return fName;
    }
    /**
     * @param fName the fName to set
     */
    public void setfName(String fName) {
        this.fName = fName;
    }
    /**
     * @return the lName
     */
    public String getlName() {
        return lName;
    }
    /**
     * @param lName the lName to set
     */
    public void setlName(String lName) {
        this.lName = lName;
    }
    /**
     * @return the addressOne
     */
    public String getAddressOne() {
        return addressOne;
    }
    /**
     * @param addressOne the addressOne to set
     */
    public void setAddressOne(String addressOne) {
        this.addressOne = addressOne;
    }
    /**
     * @return the addressTwo
     */
    public String getAddressTwo() {
        return addressTwo;
    }
    /**
     * @param addressTwo the addressTwo to set
     */
    public void setAddressTwo(String addressTwo) {
        this.addressTwo = addressTwo;
    }

}

Примечание: не помещайте обязательный = "true" в xhtml-файле

...