Visualforce의 레코드 보존 처리시, 표준 검증 에러를 회피해 임의의 action을 실행시킨다

18875 단어 SalesforceVisualforce

목적·목표


  • 각 Visualforce 페이지 메시지를 각 처리마다 지우고 싶습니다.
  • 확인 화면, 완료 화면이없는 Visualforce 페이지에서 편집 화면에서만 apex:pageMessages
  • 처리를 실행하기 전에 Visualforce 화면에서 apex:pageMessages를 지우고 처리 후 다시 완료 및 오류를 표시합니다
  • .

    Before (저장 1 처리)



    Visualforce 코드


    <apex:pageBlockButtons location="bottom">
      <apex:commandButton value="保存1" action="{!save}" reRender="container" status="spinnerStatus"/>
    </apex:pageBlockButtons>
    

    동작 화면




  • 저장 버튼을 누르면로드 화면이 표시되는 것만으로 업데이트 된 것을 인식하기 어려운

  • Try(저장 2 처리)



    Visualforce 코드


    <apex:pageBlockButtons location="bottom">
      <apex:actionFunction name="save1B" action="{!clearVfMsg}" oncomplete="return false;" reRender="container" />
      <apex:commandButton value="保存2" onclick="save1B();" action="{!save}" reRender="container" status="spinnerStatus"/>
    </apex:pageBlockButtons>
    

    동작 화면





    개선


  • immediate="true"apex:actionFunction에 붙이면 저장 버튼을 누를 때 데이터 유형, 자릿수 (Salesforce 표준) 및 필수 항목 (Salesforce 표준)의 유효성 검사 오류가 발생하면 메시지 지우기 프로세스가 실행되지 않는 것을 방지했습니다.

  • 문제


  • 메시지 지우기 전에로드 화면이 표시됩니다
  • 버튼을 연결하면 apex:pageMessages가 버그로 표시되지 않을 수 있습니다 (캡션 네 번째 저장 버튼을 누를 때)

  • After(저장 3 처리)



    Visualforce 코드


    <apex:pageBlockButtons location="bottom">
      <apex:actionFunction name="save1C" action="{!clearVfMsg}" oncomplete="save2C();" reRender="container" immediate="true"/>
      <apex:actionFunction name="save2C" action="{!save}" reRender="container" status="spinnerStatus"/>
      <apex:commandButton value="保存3" onclick="save1C(); return false;"/>
    </apex:pageBlockButtons>
    

    동작 화면





    개선


  • 메시지 지우기 후로드 화면이 표시됩니다
  • 버튼을 연타해도 apex:pageMessages에 버그가 발생하지 않는다

  • 학습한 것


  • immediate="true"apex:actionFunction에 붙이면 저장 버튼을 누를 때 데이터 유형, 자릿수 (Salesforce 표준), 필수 항목 (Salesforce 표준)의 유효성 검사 오류가 발생하는 경우에도 임의의 처리를 먼저 실행시킬 수 있습니다
  • apex:actionFunctiononcomplete를 이용하여 처리를 메소드 체인 시킬 수 있다
  • 메소드 체인 시켜 임의의 처리로 로드 화면등을 실행시킬 수 있다

  • 샘플 코드



    Visualforce 페이지
    <apex:page controller="VfTestCtrl" title="取引先責任者 編集" lightningStylesheets="true">
      <style>
        .spinnerBg{
            width: 100%;
            height: 100%;
            position: absolute;
            background-color: #000;
            opacity: 0.2;
            z-index: 999999;
        }
        .spinner{
            width: 100%;
            height: 100%;
            position: absolute;
            background-image: url("/img/loading32.gif");
            background-size: 16px;
            background-repeat: no-repeat;
            background-attachment: fixed;
            background-position: center;
            z-index: 9999999;
            opacity: 1;
        }
      </style>
    
      <apex:actionStatus id="spinnerStatus">
          <apex:facet name="start">
              <div class="spinnerBg"/>
              <div class="spinner"/>
          </apex:facet>
      </apex:actionStatus>
    
      <apex:form>
        <apex:outputPanel id="container">
          <apex:pageBlock title="取引先責任者 編集">
            <div style="min-height: 120px">
              <apex:pageMessages/>
            </div>
            <apex:pageBlockSection columns="1">
              <apex:inputField value="{!con.TestNum__c}"/>
            </apex:pageBlockSection>
            <apex:pageBlockButtons location="bottom">
              <apex:commandButton value="保存1" action="{!save}" reRender="container" status="spinnerStatus"/>
            </apex:pageBlockButtons>
            <apex:pageBlockButtons location="bottom">
              <apex:actionFunction name="save1B" action="{!clearVfMsg}" oncomplete="return false;" reRender="container" />
              <apex:commandButton value="保存2" onclick="save1B();" action="{!save}" reRender="container" status="spinnerStatus"/>
            </apex:pageBlockButtons>
            <apex:pageBlockButtons location="bottom">
              <apex:actionFunction name="save1C" action="{!clearVfMsg}" oncomplete="save2C();" reRender="container" immediate="true"/>
              <apex:actionFunction name="save2C" action="{!save}" reRender="container" status="spinnerStatus"/>
              <apex:commandButton value="保存3" onclick="save1C(); return false;"/>
            </apex:pageBlockButtons>
          </apex:pageBlock>
        </apex:outputPanel>
      </apex:form>
    </apex:page>
    

    VF 컨트롤러
    public without sharing class VfTestCtrl {
    
        public Contact con { get; set; }
        private Id conId;
    
        /** 画面表示メッセージ */
        private static final String CONTACT_NOT_EXIST_MSG       = '取引先責任者が存在しません。';
        private static final String CONTACT_UPDATE_COMPLETE_MSG = '取引先責任者の更新が完了しました。';
    
    
        public VfTestCtrl() {
            this.conId = ApexPages.currentPage().getParameters().get('Id');
    
            List<Contact> conList = queryContact(conId);
            if (conList.isEmpty()) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, CONTACT_NOT_EXIST_MSG));
                return;
            }
            this.con = conList[0];
        }
    
    
        /** VFメッセージクリア処理 */
        public void clearVfMsg() {
            ApexPages.getMessages().clear();
        }
    
    
        /** 保存処理 */
        public void save() {
            List<Contact> conList = queryContact(conId);
            if (conList.isEmpty()) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, CONTACT_NOT_EXIST_MSG));
                return;
            }
    
            update con;
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, CONTACT_UPDATE_COMPLETE_MSG));
            return;
        }
    
    
        /** 対象の取引先責任者を取得 */
        private List<Contact> queryContact(Id contactId) {
            return [
                SELECT
                    Id,
                    TestNum__c
                FROM
                    Contact
                WHERE
                    Id = :contactId
            ];
        }
    }
    
    

    좋은 웹페이지 즐겨찾기