Я не знаю, было ли это обсуждено в прошлых сообщениях, но я не мог найти ничего подобного, поэтому здесь возникает мой вопрос: у меня есть 14 полей в пользовательском элементе управления. Теперь в конкретном состоянии во время рабочего процесса мне нужно убедиться, что должны быть требуются первые 6 полей (что может быть сделано с использованием требуемого валидатора), и из остальных 8 полей пользователь должен быть вынужден ввести не менее 2 полей. Как я могу это достичь? Я использую проверку на стороне сервера для всех полей, для свойства «disableClientSideValidation» установлено значение true. Я не уверен, что в этом контексте можно использовать пользовательский валидатор, и если да, то как?xPages с использованием условной пользовательской проверки
ответ
В вашем случае вы должны использовать 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>
...
Вышеупомянутое решение является одним из способов, чтобы получить ручку валидаций (есть много), однако тис на мой взгляд, не самое лучшее решение, так как вы должны проверить и написать код каждый вход управление. Если вы хотите, вы можете сделать это по-своему, но вам придется повторить ваши проверки и поместить все это в одну функцию ssjs, которая в конечном итоге легче контролировать. Я привел пример кода, который явно не идеален и предназначен для быстрого отображения того, что я имею в виду. Если вы решите пойти таким образом, я предлагаю вам обернуть ваши функции и сделать их динамичными как можно больше. Так что ответить на вопрос. Функция validation ssjs - это то, где вы подтверждаете свои проверки на основе вашей бизнес-логики.
при отправке формы используйте группу действий.
<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>
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');") } }
В моем решении нет необходимости вводить код проверки в каждый элемент управления вводом. Мой примерный код завершен и «заботится» обо всех полях уже. –
извините, не видел двух входов и кода. Небрежно я только предполагал, так как для меня это не естественное место для проверки всех полей. Это похоже, но все же я думаю, что у вас немного больше контроля и меньше беспорядка. Не знаю фактических плюсов и минусов этих двух примеров. Еще раз извините. – dregos
Просто любопытно, но это будет работать в режиме повторного управления? – Nash
Спасибо за ваши входы я реализовывал выражение VALIDATE как было предложено вами, и это работает прекрасно. Еще раз спасибо!! – Nash