Как вызвать управляемый компонент из модального всплывающего окна ICEfaces?

Я использую Eclipse Luna EE, Tomcat v7.0 и ICEFaces 3.2

У меня есть форма для печати этикеток, в которую пользователь вводит такую ​​информацию, как номер элемента, имя элемента и тип этикетки. Затем пользователь отправляет форму. Это отправляет информацию на принтер этикеток в виде строки ZPL, которая затем выводит правильную этикетку для элемента. Это все работает без проблем.

Форма проверяет количество отпечатков в случае высокого значения (более 100 при производстве). Если количество отпечатков превышает определенное значение (> 2. только для целей тестирования), тогда логическое значение "testFlag" устанавливается в значение "истина", отображается модальное поле и устанавливается флаг ошибки, чтобы команда печати не выполнялась.

Модальное поле спрашивает, правильно ли пользователь ввел количество, с доступными кнопками Да / Нет.

PrintUI и модальное всплывающее окно внутри <ice:form> элемент с всплывающим окном, отображаемым и видимым, если для testFlag установлено значение true.

Проблема: Когда я нажимаю кнопку "Да" в модальном окне, он не выполняет назначенное ему действие (System.out.println("Yes Button!")). Модальная коробка закрывается и ничего не происходит.

Затем я могу повторно отправить форму, и снова появляется модальное окно, затем я нажимаю "Да", и ничего не происходит.

Если я изменяю количество на 2 и отправляю, то он без проблем выполняет команду печати.

Я предполагаю, что это проблема с тем, как обрабатывается сессия.

Вопрос: Как получить кнопку "Да" на модальном поле, чтобы выполнить код, который я хочу?

Я пробовал: используя <ice:commandLink>, <h:button>, <h:commandButton>, <h:commandLink>

Наличие модального всплывающего окна и формы в отдельности <ice:form> теги (это обновило сеанс и удалило все введенные данные).

Используя actionListener

код, содержащий форму:

<h:body>
    <div id="surround">
        <ice:form id="test" prependId="false">
            <ui:include src="./printUI.xhtml" />
            <ui:include src="./printQtyPopup.xhtml" />
        </ice:form>
    </div>
</h:body>

printQtyPopup.xhtml

    <ui:composition>
        <ice:panelPopup modal="true" visible="#{validateBean.testFlag}" rendered="#{validateBean.testFlag}">
            <f:facet name="header">
                <ice:outputText value="Print Quantity Check" />
            </f:facet>
            <f:facet name="body">
                <ice:panelGrid>
                    <ice:outputText value="You selected a print quantity of: #{validateBean.printAmount}" />
                    <ice:outputText value="Is this correct?" />
                    <ice:panelGroup>
                        <ice:commandButton value="No" />
                        <ice:commandButton value="Yes" action="#{validateBean.checkQtyYes}" />
                    </ice:panelGroup>
                </ice:panelGrid>
            </f:facet>
        </ice:panelPopup>
    </ui:composition>

Соответствующий код ValidateBean.java

    public void validate() { //validation checks are carried out when the user clicks "Print" on the printUI.
        if (!errorFlag && checkQty && printQty > 2) {
            testFlag = true;
            errorFlag = true;
            System.out.println("Qty Check Modal");
        }

        if (!errorFlag) {
            if (printQty > 0) {
                initialiseString();

                initialisePrinter();

                clear();
            } else {
                printQty = 0;
                errorMessage = true;
                quantityInvalid = true;
                errorFlag = true;
            }
        }
    }

    public void checkQtyYes() {
        System.out.println("Yes Button!");
    }

1 ответ

Решение

Я нашел альтернативу.

Я удалил модальное всплывающее окно и любой код, связанный с ним.

Я добавил в <ice:panelConfirmation> в конце моей формы. Это отображается только в том случае, если количество отпечатков превышает указанное мной число.

Я получаю номер с помощью valueChangeListener="#{validateBean.printQtyChange}" на моем количестве печати <h:inputText> с onblur="submit()"

Я попробовал onchange="submit()" но столкнулись с проблемами при отправке строки заданий на печать. Я должен был бы нажать "ENTER", чтобы вызвать onchange Атрибут для активации, который, я уверен, пользователи не хотят.


<ice:panelConfirmation> работает, приостановив отправку формы и ожидая ответа, прежде чем она либо продолжит, либо остановит отправку. Который завершает то, что я пытался достичь с помощью модального всплывающего окна.


Печатать количество вводимого текста:

<h:inputText id="printQty" value="#{validateBean.printAmount}" size="8" autocomplete="off" 
    maxlength="3" required="true" onblur="submit()" 
    valueChangeListener="#{validateBean.printQtyChange}" />

valueChangeListener:

public void printQtyChange(ValueChangeEvent e) {
    printAmount = e.getNewValue().toString();

    try {
        ls.setPrintQty(Integer.parseInt(printAmount));
    } catch (NumberFormatException eve) {
        errorMessage = true;
        quantityInvalid = true;
        errorFlag = true;
    }

    printQty = ls.getPrintQty();

    System.out.println("Qty : " +printQty);

    if (printQty < 1) {
        errorMessage = true;
        quantityInvalid = true;
        errorFlag = true;
    }
}

Подтверждение панели: внутри <ice:form>, Незадолго до закрытия формы

<ice:panelConfirmation id="confirmQty"
    acceptLabel="Yes"
    cancelLabel="No"
    message="Your entered the quantity: #{validateBean.printQty}. Is this correct?"
    title="Confirm Quantity"
    draggable="false"
    rendered="#{validateBean.printQty > 2}" />

Кнопка печати: связана с <ice:panelConfirmation>

<ice:commandButton styleClass="button" id="printButton" value="Print" 
    actionListener="#{validateBean.validate}" panelConfirmation="confirmQty" />

Если кто-нибудь знает способ вызова управляемого компонента из условного модального всплывающего окна ICEfaces, это было бы замечательно.


ОБНОВЛЕНИЕ Я с тех пор изменил все мои <h:inputText> в <ice:inputText> и добавил partialsubmit="true" в мое поле ввода для количества. с добавлением этого я смог удалить onblur="submit()"

НОВЫЙ печатный текст для ввода количества:

<ice:inputText id="printQty" value="#{validateBean.printAmount}" size="8" autocomplete="off"
    maxlength="3" required="true" valueChangeListener="#{validateBean.printQtyChange}"
    partialSubmit="true" />

Это устранило проблему, из-за которой иногда возникали проблемы при отправке ряда заданий.

Я не положил partialsubmit="true" на <ice:form> потому что я должен был тогда объявить каждое другое поле ввода как partialsubmit="false" чтобы предотвратить выполнение ненужного кода. Более аккуратно иметь его только в поле ввода, которое я хочу проверить.

Другие вопросы по тегам