2013-06-06 6 views
1

Я в тупике. У меня есть поле ввода на xpage, где я добавил пользовательский валидатор. Я не могу заставить пользовательский валидатор срабатывать независимо от того, что я пытаюсь сделать. Существует также validateRequired, который работает как ожидалось. Сообщение об ошибке отправляется в элемент управления «Отображение ошибок», проверка доступа к клиенту отключена. Цель пользовательского валидатора - проверить, была ли введена действительная дата. После того, как я получу его работу, я также планирую добавить другую сложную проверку, такую ​​как проверка действительного дня недели.Не могу получить пользовательский валидатор для стрельбы

Операторы печати работают корректно, как показано в «in true» в консоли на допустимую дату, а «внутри false» показывает недопустимую дату. Если я добавлю тестовый запрос печати после оператора if, он не будет выполняться так, как вы думаете. Для любого условия сообщение не отображается, и страница отправляется.

Я попытался использовать getValue() и getSubmittedValue. Я также попробовал возвратить facesMessage и строку. Я также очень открыт для лучших способов сделать это.

<xp:inputText id="datepicker" styleClass="datepicker" 
value="#{viewScope.arrivalDate}" 
defaultValue="#{javascript:statusBean.arrivalDate}" 
disableClientSideValidation="true"> 
     <xp:this.validators> 
     <xp:validateRequired message="Please enter the arrival date"> 
     </xp:validateRequired> 
     <xp:customValidator message="err" loaded="true"> 
      <xp:this.validate><![CDATA[#{javascript:var datepicker = getComponent("datepicker").getSubmittedValue(); 
      var testDate = @IsTime(@TextToTime(datepicker)); 
      print("testDate=" + testDate); 
      if(testDate == 0){ 
      print("inside false"); 
      return false; 
     } else if(testDate == 1){ 
      print("inside true"); 
      return true; 
      }}]]> 
      </xp:this.validate> 
     </xp:customValidator> 
    </xp:this.validators> 
+0

Для меня «customValidator» неожиданно прекратил работу в 8.5.2FP3, и мне пришлось изменить его на 'this.validator', как показано Павлом. –

ответ

3

Я не пробовал с валидатора, но вот SSJS я положил в собственности валидатора для образца демо в LUGs в прошлом году:

<xp:this.validator> 
<![CDATA[#{javascript:var sv = this.getSubmittedValue(); 
print ("Checking submitted value for input1 '" + sv + "' is more than 5 characters"); 
print ("Value for input1 is " + this.getValue()); 
if (sv.length < 5) { 
    var msgStr = "You must enter your FULL name, which will be more than 5 characters!"; 
    var msgObj = new javax.faces.application.FacesMessage(javax.faces.application.FacesMessage.SEVERITY_ERROR, msgStr, msgStr); 
    facesContext.addMessage(getClientId(this.getId()), msgObj); 
    this.setValid(false); 
}}]]> 
</xp:this.validator> 

Обратите внимание, что он добавляет facesMessage, а также устанавливает допустимое свойство компонента в false.

+0

Это работает отлично !!! Спасибо, Пол. –

3

Пользовательский валидатор должен возвращать строку с сообщением об ошибке в ней - а не true или false.

Так что в вашем случае, сделать это вместо того, чтобы:

<xp:customValidator message="err" loaded="true"> 
    <xp:this.validate><![CDATA[#{javascript: 
     var datepicker = getComponent("datepicker").getSubmittedValue(); 
     var testDate = @IsTime(@TextToTime(datepicker)); 
     print("testDate=" + testDate); 
     if(testDate == 0){ 
      print("inside false"); 
      return "Invalid date"; 
     } 
    }]]></xp:this.validate> 
</xp:customValidator> 
+0

Это не работает. @Per Я действительно видел комментарий от вас в ответ на аналогичный вопрос и пробовал его, прежде чем задал вопрос. Сегодня я попробовал все это снова и снова. Распечатка выполняется, если значение true, но ничего не было возвращено в , и форма была отправлена. VaildateRequired работает, как ожидалось. –

+0

Попытка вместо не имеет значения. –

+0

Что делать, если вы вернете объект facesMessage? return new javax.faces.application.FacesMessage («Недопустимая дата»); Также обратите внимание на этот комментарий от Sven, что валидаторы не могут проверять пустые значения: http://stackoverflow.com/questions/14609867/xpages-custom-validator –

1

Вот моя версия с использованием xSnippet - postValidationError.

<xp:customValidator> 
    <xp:this.validate><![CDATA[#{javascript: 
     if (@IsTime(@TextToTime(@Trim(value))) == 0){ 
      postValidationError(this, "Please enter a valid Date/Time") 
     } 
    }]]></xp:this.validate> 
</xp:customValidator> 
+0

Похоже, что это глобальная функция, которая эффективно делает то же самое. Я бы рекомендовал использовать это, если вы сильно используете SSJS (это меньше печатает). –

Смежные вопросы