2017-11-23 11 views
1

Primeface에서 fileUpload 컨트롤의 "선택"버튼을 클릭 할 때 업로드 할 파일을 선택하기 전에 양식에서 유효성 검사를 실행하고 싶습니다. 이것이 가능한가? 현재 사용자는 유효성 검사없이 "선택"및 "업로드"를 클릭 할 수 있습니다. 이로 인해 내 문서는 저장되지 않지만 첨부 파일이 생성됩니다. 양식을 성공적으로 확인하고 저장할 때까지 fileUpload 컨트롤을 숨길 수 있지만 가능한 경우 "선택"버튼을 클릭 할 때 유효성 검사를 호출하는 것이 좋습니다. onStart에서 remoteCommand 호출을 시도했지만 유효성 검사를 강제로 수행 할 수없는 것으로 보입니다.p : fileUpload - 업로드하기 전에 양식 유효성 검사

+0

bean에서 제어되는 "disabled"속성에서 부울 변수를 사용할 수 있으며 유효성 검사 후 업로드 구성 요소와이 변수를 업데이트합니다. –

+0

안녕하세요 호르헤, 응답 해 주셔서 감사합니다. 사용자가 "선택"을 클릭했을 때 유효성 검사를 어떻게 호출 할 수 있습니까? 나는 그것이 첨부 파일을 업로드하기 전에 필요한 것에 대한 피드백을 사용자에게 제공하기 때문에 이런 식으로하고 싶다. – NeilC

답변

1

p:fileUpload 자바 스크립트와 p:remoteCommand을 결합하여 선택 버튼을 클릭하면 양식 유효성 검사를 트리거 할 수 있습니다.

기본 개념

  • 차단 유효성 검사가 OK 인 경우
  • p:remoteCommand 완료가하고, 그렇지 않은 경우, 기본 결과 (파일 선택 대화 상자의 개방)를 방지하고 대신 p:remoteCommand을 실행 버튼을 클릭 이벤트를 선택 prevent 폼 입력 요소의 일부 데이터가 다시 변경 될 때까지 더 이상 버튼 클릭을 선택하지 마십시오. 개념 예제 코드의

증거는

이 페이지

<script> 
      var triggerValidation; 
      window.onload = function() { 
       //initially (after page is loaded) trigger validation on Choose btn click 
       triggerValidation = true; 
       //define button click listener 
       registerChooseBtnClick(); 
      }; 

      function registerChooseBtnClick() { 
       //var chooseBtn = document.getElementsByClassName("ui-fileupload-choose")[0]; 
       // or if you define p:upload widgetVar you can use PF function    
       var chooseBtn = PF('fileUploadWidget').chooseButton[0]; 
       chooseBtn.addEventListener('click', fnRef, false); 
      } 

      var fnRef = function (event) { 
       console.log("Button clicked"); 
       if (triggerValidation) { 
        //prevent file browser to open 
        event.preventDefault(); 
        //trigger validation via p:remoteCommand; 
        submitSelection(); 
       } else { 
        //File browser will be opened at this point 
       } 
      }; 

      function checkIfValidationFailed(xhr, status, args) { 
       if (args) { 
        if (args.validationFailed) { 
         console.log("Validation failed"); 
         triggerValidation = true; 
        } else { 
         triggerValidation = false; 
        } 
       } 
      } 

      //call each time when form input elements (inputText, ...) change value 
      function forceValidation(){ 
       triggerValidation = true; 
      } 

     </script> 

자바 스크립트을 추가하고 페이지를 추가 : 여기

  <p:remoteCommand 
       name="submitSelection" process="@form" 
       oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/> 

또한 remoteCommand

 <h:form id="form"> 
      <p:messages autoUpdate="true"/> 
      <p:panelGrid columns="1"> 
       <!--size is integer variable--> 
       <p:inputText id="size" maxlength="3" 
          value="#{yourBean.size}" 
          required="true" requiredMessage="Size is missing" 
          onchange="forceValidation();"/> 

       <p:fileUpload 
        id="upload" 
        widgetVar="fileUploadWidget" 
        fileUploadListener="#{yourBean.onUpload}" 
        multiple="true" 
        allowTypes="/(\.|\/)(jpg|png)$/" /> 
      </p:panelGrid> 

      <p:remoteCommand 
       name="submitSelection" process="@form" 
       oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/> 
      <p:commandButton 
       id="submitBtn" value="Sumbit" process="@form" 
       actionListener="#{yourBean.onSubmit()}"/> 
     </h:form> 
 <h:form id="form"> 
      <p:messages autoUpdate="true"/> 
      <p:panelGrid columns="1"> 
       <!--size is integer variable--> 
       <p:inputText id="size" maxlength="3" 
          value="#{yourBean.size}" 
          required="true" requiredMessage="Size is missing" 
          onchange="forceValidation();"/> 

       <p:fileUpload 
        id="upload" 
        widgetVar="fileUploadWidget" 
        fileUploadListener="#{yourBean.onUpload}" 
        multiple="true" 
        allowTypes="/(\.|\/)(jpg|png)$/" /> 
      </p:panelGrid> 

      <p:remoteCommand 
       name="submitSelection" process="@form" 
       oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/> 
      <p:commandButton 
       id="submitBtn" value="Sumbit" process="@form" 
       actionListener="#{yourBean.onSubmit()}"/> 
     </h:form> 
+0

감사합니다. 훌륭한 솔루션입니다! 내 문서에 읽기/편집 모드가있어 'on'버튼 이벤트가 '선택'버튼을 등록하지 못하게하는 약간의 문제가 있습니다. (업로드 컨트롤은 읽기 모드로 숨겨져 있습니다.) 그러나 나는 그 문제를 해결할 수 있습니다. – NeilC

+0

나는 그것이 당신을 위해 일할지도 모르기 때문에 기쁘다. 이 경우 chooseBtn.removeEventListener를 사용하여 편집 모드로 전환 한 후 트리거를 등록하고 읽기 모드로 전환 한 후 등록을 취소 할 수 있습니다. –

+0

또한이 답변을 유용하게 사용하는 경우 [누군가 내 질문에 대답하면 어떻게해야합니까?] (https://stackoverflow.com/help/someone-answers) :) –