Открывающий диалог проверяет основную форму, чего я не хочу - PullRequest
0 голосов
/ 24 сентября 2019

Если я нажимаю кнопку добавления (например, идентификатор «CreateCategory1»), чтобы добавить одну новую категорию продукта, я получаю сообщение проверки «Имя поля обязательно».Это должно открыть один диалог, где я могу ввести новое имя категории, ничего больше.На данный момент я не хочу проверять основную форму, потому что я просто хочу добавить одну новую категорию продуктов, которую я буду использовать позже.Почему открывается диалоговое окно, подтверждающее форму?Как я могу избежать этого?

Большое спасибо!

    <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <ui:composition >
        <h:outputScript library="js" name="warning.js"/>  
        <h:form id="ProductEditForm" target="_blank">
            <div class="ui-fluid">
                <p:panelGrid columns="4" columnClasses="ui-grid-col-6,ui-grid-col-2,ui-grid-col-2,ui-grid-col-2" layout="grid" styleClass="ui-panelgrid-blank" >
                    <p:outputPanel style="height: 70px" >
                        <p:breadCrumb model="#{breadCrumb.productMenuModel}" style="background: inherit; border: none" />           
                        <h2>#{productController.selected.name}</h2>
                    </p:outputPanel>
                    <p:commandButton style="height: 30px; background: #{userController.headerColor}"  icon="ui-icon-check" oncomplete="javascript:saved=true" action="#{productController.update}" actionListener="#{breadCrumb.navigateProduct()}" update=":center,:growl" value="#{bundle.Save}" />
                    <p:commandButton style="height: 30px" icon="ui-icon-close" oncomplete="javascript:saved=true"  action="#{productController.refreshSelected()}" actionListener="#{breadCrumb.navigateProduct()}" update=":center,:growl" value="#{bundle.Cancel}"/>
                    <p:commandButton style="height: 30px" icon="ui-icon-document" update="@([id$=ProductHistoryDateForm])" oncomplete="PF('ProuctHistoryDateDialog').show()" value="Print history" disabled="#{empty productController.selected}" />
                </p:panelGrid>
                <p:panelGrid columns="2" columnClasses="ui-grid-col-6,ui-grid-col-6" layout="grid" >
                    <p:panel>
                        <h3>Main info</h3>   
                        <p:panelGrid columns="2" columnClasses="ui-grid-col-3,ui-grid-col-9" layout="grid" styleClass="ui-panelgrid-blank">
                            <p:outputLabel value="#{bundle.EditProductLabel_name}" for="name" />
                            <p:inputText id="name" value="#{productController.selected.name}" title="#{bundle.EditProductTitle_name}" required="true" requiredMessage="#{bundle.EditProductRequiredMessage_name}"/>
                            <p:outputLabel value="#{bundle.EditProductLabel_originalName}"/>
                            <p:inputText id="originalName" value="#{productController.selected.originalName}"/>
                            <h:outputText value="#{bundle.ViewInventoryItemLabel_serialized}"/>
                            <p:selectBooleanCheckbox disabled="false" value="#{productController.selected.serialized}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_ean}" for="ean" />
                            <p:inputText id="ean" value="#{productController.selected.ean}" title="#{bundle.EditProductTitle_ean}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_itemNr}" for="itemNr" />
                            <p:inputText id="itemNr" value="#{productController.selected.itemNr}" title="#{bundle.EditProductTitle_itemNr}" />
                            ...
                        </p:panelGrid>
                        <h3>Sales</h3>
                        <p:panelGrid columns="2" columnClasses="ui-grid-col-3,ui-grid-col-9" layout="grid" styleClass="ui-panelgrid-blank">
                            <p:outputLabel for="defaultSupplier" value="#{bundle.EditProduct_defaultSupplier}"/>
                            <p:selectOneMenu id="defaultSupplier" filter="true" value="#{productController.selected.defSupplierPartner}" title="#{bundle.EditProduct_defaultSupplier}" effect="fold" editable="false">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{partnerController.items}"
                                               var="partnerDataIdItem"
                                               itemValue="#{partnerDataIdItem}"
                                               itemLabel="#{partnerDataIdItem.name}"/>
                            </p:selectOneMenu>
                            <p:outputLabel value="#{bundle.EditProductLabel_purchaseDeliveryTime}" for="purchaseDeliveryTime" />
                            <p:inputText id="purchaseDeliveryTime" value="#{productController.selected.purchaseDeliveryTime}" title="#{bundle.EditProductTitle_purchaseDeliveryTime}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_lastPurchase}" />
                            <p:inputText id="lastPurchase" value="#{productController.selected.lastPurchasePrice}" />
                            ...
                        </p:panelGrid>
                    </p:panel>
                    <p:panel id ="productGroups">
                        <h3>Product categories</h3>
                        <p:panelGrid columns="3" columnClasses="ui-grid-col-1,ui-grid-col-1,ui-grid-col-11" layout="grid" styleClass="ui-panelgrid-blank">

                            <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            
                            <p:commandButton id="DeleteCategory1" disabled="#{productController.selected.productCategoryId1 == null}" update="category1" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId1)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category1" value="#{productController.selected.productCategoryId1}" label="#{productController.selected.productCategoryId1.name}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(1)}" 
                                               var="item" 
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
                            </p:selectOneMenu>
                            <p:commandButton id="CreateCategory2" rendered="#{productController.selected.productCategoryId1 != null}" actionListener="#{productCategoryController.prepareCreate(2)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>
                            <p:commandButton id="DeleteCategory2" disabled="#{productController.selected.productCategoryId2 == null}" update="category2" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId2)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="#{productController.selected.productCategoryId2.name}" value="#{productController.selected.productCategoryId2}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(2)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
                            </p:selectOneMenu> 
                            <p:commandButton id="CreateCategory3" rendered="#{productController.selected.productCategoryId2 != null}" actionListener="#{productCategoryController.prepareCreate(3)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>
                            <p:commandButton id="DeleteCategory3" disabled="#{productController.selected.productCategoryId3 == null}" update="category3" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId3)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category3" label="#{productController.selected.productCategoryId3.name}" rendered="#{productController.selected.productCategoryId2 != null}" value="#{productController.selected.productCategoryId3}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(3)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(3)}"/>
                            </p:selectOneMenu> 
                            <p:commandButton id="CreateCategory4" rendered="#{productController.selected.productCategoryId3 != null}" actionListener="#{productCategoryController.prepareCreate(4)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/> 
                            <p:commandButton id="DeleteCategory4" disabled="#{productController.selected.productCategoryId4 == null}" update="category4" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId4)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category4" label="#{productController.selected.productCategoryId4.name}" rendered="#{productController.selected.productCategoryId3 != null}" value="#{productController.selected.productCategoryId4}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(4)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(4)}"/>
                            </p:selectOneMenu> 
                        </p:panelGrid>
                    </p:panel>
                </p:panelGrid>
            </div> 
        </h:form>
    </ui:composition>
</html>

1 Ответ

1 голос
/ 25 сентября 2019

Это НЕ прямой ответ, а длинный подробный комментарий о том, что не так с этим вопросом и как реальную проблему можно просто сузить, сделав [mcve] ... с простым ответом в конце.

  • Удалить композицию
  • Удалить h:outputScript
  • Удалить все стили
  • Удалить структурные div s panelGrid и другие
  • Удалите «связки» с метки и сделайте их статичными
  • Удалите большинство входных данных (оставьте один, чтобы он все еще демонстрировал проблему)
  • Удалите большинство кнопок, которые открывают диалоговое окно иоставьте один (тот, на который вы ссылались), чтобы он все еще демонстрировал проблему

Как это могло бы выглядеть тогда

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <h:form id="ProductEditForm" target="_blank">

        <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            

        <p:selectOneMenu id="category1" value="#{productController.selected.productCategoryId1}" label="Category 1">
            <f:selectItem itemLabel="Select one" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{productCategoryController.getItemsByLevel(1)}" var="item" itemLabel="#{item.name}"/>
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
        </p:selectOneMenu>

        <p:selectOneMenu id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="Category 2" value="#{productController.selected.productCategoryId2}" effect="fold">
            <f:selectItem itemLabel="Select one" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{productCategoryController.getItemsByLevel(2)}" var="item" itemLabel="#{item.name}"/>
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
    </p:selectOneMenu> 

    </h:form>

</html>

Вы могли бы даже сделать это проще, используяобычный p:inputText вместо p:selectOneMenu с.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <h:form id="ProductEditForm" target="_blank">

        <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            

        <p:inputText id="category1" value="#{productController.selected.productCategoryId1}" label="Category 1">
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
        </p:inputText>

        <p:inputText id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="Category 2" value="#{productController.selected.productCategoryId2}">

            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
    </p:inputText> 

    </h:form>

</html>

И если проблема все еще возникает h:inputText с f:ajax И даже h:commandButton с f:ajax (изменяя значение oncomplete наonevent), делая его менее зависимым от PrimeFaces (и при этомспойте ошибку).

Но теперь мы подходим к ней ... Неполное завершение диалога ... Это на самом деле связано с открытием диалога?Что если бы вы использовали простое oncomplete="alert('Hi there'); "в commandButton? Не получается ли это? 100% уверенность в этом, поэтому ваш заголовок

Открытие диалогового окна проверяет основную форму, что мне не нужно

и ваш вопрос

«Почему при открытии диалогового окна проверяется форма?»

Не правы оба ... Что, если вы полностью удалите oncomplete?По-прежнему не удается? Да ... Хмммм ... Так что это просто связано с нажатием кнопки. Что делает кнопка? Она отправляет форму ... проверяет ее ... Так что ваш вопрос фактически становится

«Как я могу запретить команде command отправлять и проверять всю мою форму»

И вы могли бы также прийти сюда, начав сначала удалять oncomplete, задавая себе вопрос:вопрос, связанный с заголовком:

"Это связано с открытием диалога?Что если я не открою диалог?Где мне это сделать?В конце, так что, если я уберу это ").

Если вы разместили свой новый вопрос в поисковой системе и добавили на него" PrimeFaces JSF site: stackoverflow.com ", выпосле некоторого прочтения нашла:

PrimeFaces отключить проверку при нажатии кнопки отмены

, что в точности соответствует заявлению. Может быть недостаточно (может потребоватьсядобавьте какой-нибудь другой идентификатор в атрибут process полей, которые вы хотите отправить с помощью определенной кнопки, но тогда у вас будет более подробный вопрос к вопросу.

Вы, конечно, также можете сделать большечем одна форма, отправив меньшие части

Как использоватьна странице JSF?Одиночная форма?Несколько форм?Вложенные формы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...