Xpages - проверка SSJS с CSJS onComplete - PullRequest
0 голосов
/ 16 октября 2018

Я использую настраиваемый элемент управления многократного использования, одно из настраиваемых свойств поля в каждом настраиваемом элементе управления - указать, является ли поле обязательным, да или нет.Если да, и поле пустое, отображается текст справки и цвет меняется на красный.Это все хорошо.Тем не менее, у меня есть ALOT этих полей в моей форме, и поэтому я хочу отобразить сообщение в верхней части экрана, если одно или несколько полей не прошли проверку, и я не уверен, как я могу это сделать.У меня есть кнопка «Отправить», и нажатие на нее работает, но я не могу заставить его запускать какой-либо SSJS, так как поля не проходят проверку, поэтому он никогда не запускает код.Я думал, что смогу что-то сделать с CSJS onComplete, однако я не уверен, как я могу справиться, если валидация не удалась «где-то», не перечисляя все имена полей и не просматривая их все.Конечная цель, если проверка не пройдена, - показать сообщение пользователю и прекратить обработку кода.Если проверка пройдена, я тогда называю модальный.Я могу заставить все эти биты работать, но мне просто нужно знать, как определить, прошла ли проверка или не прошла валидация, и продолжить выполнение некоторого кода, если он потерпит неудачу.

Я думаю, что могу использовать facesContext.getMessages().hasNext()чтобы проверить сообщения, но опять же, я не могу даже назвать это, поскольку любые поля, которые «обязательны», не позволяют остальной части моего кода работать.

Заранее спасибо за любые указатели

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я решил это следующим образом:

computedText, hidden:

<xp:text escape="true" id="cmpValidation" style="display:none">
        <xp:this.value><![CDATA[#{javascript:if(facesContext.getMessages().hasNext()){
    return "Fail";
}else{
    return "Succes";
}}]]></xp:this.value>
    </xp:text>

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

<xp:button value="Test Submit" id="button3" styleClass="btn btn-header">



    <xp:eventHandler event="onclick" submit="true" refreshMode="partial"
        refreshId="contentWhiteBackground">



        <xp:this.onComplete><![CDATA[var val = XSP.getElementById("#{id:cmpValidation}").innerHTML;

if(val =="Fail"){
    var o = {};
    o.title = "Validation Failed";
    o.body = "You must complete all questions before submitting";
    o.alertIcon = "fa-thumbs-down fa-lg";
    o.alertType = "danger";

    var myDiv = document.getElementById("#{id:contentWhiteBackground}");
    myDiv.scrollTop = 0;
    bootAlert.show('alertServer',JSON.stringify(o));

}else{
    $('#modalConclusion').modal('show');
}
]]></xp:this.onComplete>
    </xp:eventHandler>

</xp:button>
0 голосов
/ 16 октября 2018

Прежде всего, я надеюсь, что вы правильно поняли ваш вопрос!Следующий фрагмент кода фокусируется на вашей конечной цели:

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

Пользовательский элемент управления

В моем приложении я использую Пользовательский элемент управления для обобщения всех сообщений об ошибках формы:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:panel id="pnlFormError">
        <xp:text escape="true" id="txtErrorMsgTitle"
            value="#{javascript:compositeData.errorMessageTitle}"
            style="font-weight:bold;color:rgb(255,0,0)">
        </xp:text>
        <xp:messages id="valsErrorMessages" 
            showSummary="true" disableTheme="true">
        </xp:messages>
    </xp:panel>

</xp:view>

XPage

А здесь xpage с некоторыми элементами управления вводом формы, модальным диалогом и пользовательским элементом управления включенным сообщением об ошибке:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom" xmlns:xe="http://www.ibm.com/xsp/coreex">

    <xp:div id="container">
        <xc:globalFormErrorPanel errorMessageTitle="Please check the following errors:">
            <xp:this.rendered><![CDATA[#{javascript:facesContext.getMaximumSeverity()}]]></xp:this.rendered>
        </xc:globalFormErrorPanel>

        <xp:br></xp:br>
        Input Control:&#160;
        <xp:inputText id="txtInput" required="true">
            <xp:this.validators>
                <xp:validateRequired message="You have to enter a value (with min 10 charachters)!"></xp:validateRequired>
                <xp:validateLength minimum="10"></xp:validateLength>
            </xp:this.validators>
        </xp:inputText>

        <xp:br></xp:br>
        Input Control3:&#160;
        <xp:inputText id="txtInput2" required="true">
            <xp:this.validators>
                <xp:validateRequired message="You have to enter a value (with min 5 charachters)!"></xp:validateRequired>
                <xp:validateLength minimum="5"></xp:validateLength>
            </xp:this.validators>
        </xp:inputText>

        <xp:br></xp:br>
        <xp:br></xp:br>
        <xp:button id="btnSubmit" value="Submit">
            <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="container" execMode="partial"
                execId="container">
                <xp:this.action><![CDATA[#{javascript:getComponent("dlgModal").show();
print('Do some server side logic');}]]></xp:this.action>
            </xp:eventHandler>
        </xp:button>
    </xp:div>

    <xe:dialog id="dlgModal" title="Modal Dialog (only shown if validation not fails!)"></xe:dialog>

</xp:view>
...