2013-09-07 2 views
1

Я не знаю, было ли это обсуждено в прошлых сообщениях, но я не мог найти ничего подобного, поэтому здесь возникает мой вопрос: у меня есть 14 полей в пользовательском элементе управления. Теперь в конкретном состоянии во время рабочего процесса мне нужно убедиться, что должны быть требуются первые 6 полей (что может быть сделано с использованием требуемого валидатора), и из остальных 8 полей пользователь должен быть вынужден ввести не менее 2 полей. Как я могу это достичь? Я использую проверку на стороне сервера для всех полей, для свойства «disableClientSideValidation» установлено значение true. Я не уверен, что в этом контексте можно использовать пользовательский валидатор, и если да, то как?xPages с использованием условной пользовательской проверки

ответ

3

В вашем случае вы должны использовать validateExpression. Код SSJS должен возвращать true или false. Внутри кода вы можете получить доступ к другим полям с помощью getComponent("otherFieldName").getSubmittedValue() и проверить, как заполняется количество полей. В случае 0 или 1 возвращает false и в противном случае true.

validateExpression выполняется только в том случае, если поле не пустое. Итак, добавьте validationExpression в одно из ваших первых 6 обязательных полей и добавьте туда validateRequired.

Пример:

<xp:inputText 
    id="inputRequired1" 
    value="#{...}" 
    disableClientSideValidation="true"> 
    <xp:this.validators> 
     <xp:validateRequired message="field is required"></xp:validateRequired> 
     <xp:validateExpression message="please, fill at least two fields"> 
      <xp:this.expression><![CDATA[#{javascript: 
      num = 0; 
      for (i = 1; i <= 8; i++) { 
       if (getComponent("inputText" + i).getSubmittedValue() !== "") { 
        num++; 
       } 
      } 
      if (num < 2) { 
       return false; 
      } 
      return true}]]></xp:this.expression> 
     </xp:validateExpression> 
    </xp:this.validators> 
</xp:inputText> 
<xp:inputText 
    id="inputText1" 
    value="#{...}"> 
</xp:inputText> 
<xp:inputText 
    id="inputText2" 
    value="#{...}"> 
</xp:inputText> 
... 
+0

Спасибо за ваши входы я реализовывал выражение VALIDATE как было предложено вами, и это работает прекрасно. Еще раз спасибо!! – Nash

1

Вышеупомянутое решение является одним из способов, чтобы получить ручку валидаций (есть много), однако тис на мой взгляд, не самое лучшее решение, так как вы должны проверить и написать код каждый вход управление. Если вы хотите, вы можете сделать это по-своему, но вам придется повторить ваши проверки и поместить все это в одну функцию ssjs, которая в конечном итоге легче контролировать. Я привел пример кода, который явно не идеален и предназначен для быстрого отображения того, что я имею в виду. Если вы решите пойти таким образом, я предлагаю вам обернуть ваши функции и сделать их динамичными как можно больше. Так что ответить на вопрос. Функция validation ssjs - это то, где вы подтверждаете свои проверки на основе вашей бизнес-логики.

  1. при отправке формы используйте группу действий.

    <xp:eventHandler id="ehButtonSave" 
        refreshMode="partial" submit="true" event="onclick" 
        refreshId="somePanelId" > 
    
        <xp:this.action> 
         <xp:actionGroup> 
          <xp:this.condition> 
           <!-- here you validate your fields. Look at number 2 for example --> 
           <!-- this validation function must return true or false which defines if the rest of the code in action group will be executed and the form submitted--> 
           <![CDATA[{javascript:validate("componentValidationErrorDsp");}]]> 
          </xp:this.condition> 
          <xp:executeScript> 
           <xp:this.script> 
            <![CDATA[#{javascript: 
             <!-- here you can do something with your document --> 
             someSSJSFunction(document1.getDocument()); 
            }]]> 
           </xp:this.script> 
          </xp:executeScript> 
    
          <xp:save></xp:save> 
    
         </xp:actionGroup> 
        </xp:this.action> 
    
        <xp:this.onComplete> 
         <![CDATA[XSP.partialRefreshPost('#{id:someInnerPanelId}',{}) ;]]> 
        </xp:this.onComplete> 
    </xp:eventHandler> 
    
  2. Validation пример

    var validate = function(dspErrControlName){ 
    
        var dspErrControl = getComponent(dspErrControlName); 
        var inputField = getComponent("InputText1"); 
        if(isEmpty(inputField.getValue()){ 
         // here is where you push the validation message back to the displayErrors xsp control. 
         var msgObj = new javax.faces.application.FacesMessage(javax.faces.application.FacesMessage.SEVERITY_ERROR, "validation message", "validation message"); 
         facesContext.addMessage(dspErrControl.getClientId(facesContext), msgObj); 
    
         //and here is a little trick to color your inputs so the user can see where exactly is the problem. 
         //What you do is you set the attribute aria-invalid of the input text component to true. Which you can handle with your CSS to become red or something. 
         //CSS example: [aria-invalid=true] { background-color: #fee; border-color: red; } 
         var inpuId=getClientId("InputText1"); 
         view.postScript("dojo.attr(dojo.byId('"+inputId+"'), 'aria-invalid', 'true');") 
        } 
    } 
    
+0

В моем решении нет необходимости вводить код проверки в каждый элемент управления вводом. Мой примерный код завершен и «заботится» обо всех полях уже. –

+0

извините, не видел двух входов и кода. Небрежно я только предполагал, так как для меня это не естественное место для проверки всех полей. Это похоже, но все же я думаю, что у вас немного больше контроля и меньше беспорядка. Не знаю фактических плюсов и минусов этих двух примеров. Еще раз извините. – dregos

+0

Просто любопытно, но это будет работать в режиме повторного управления? – Nash

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

  • Нет связанных вопросов^_^