클라이언트 측 스크립트 사용 사례

  • 릴리스 버전: Zurich
  • 업데이트 날짜 2025년 07월 31일
  • 소요 시간: 16분
  • 클라이언트 측 스크립트의 사용 사례에는 필드 메시지 표시, 양식 색상 변경, 필드 추가, UI 라우팅 작업 생성 등이 있습니다.

    서비스 카탈로그 체크 아웃에 필드 추가

    다음은 카트에 담지 않은 레이아웃 매크로를 사용하여 요청 대상 필드 아래의 체크아웃에 회사 필드를 추가하는 예입니다. 즉, glide.sc.use_cart_layoutsFalse입니다.

    시작하기 전에

    필요한 역할: admin

    이 태스크 정보

    그림 1. 필드에 대해 요청됨
    필드에 "시스템 관리자"가 있는 대화 상자에서 요청됨.

    이 필드는 제공된 값을 서비스 카탈로그 요청의 회사 필드에 전달합니다.

    이 예시에서는 다음과 같이 가정합니다.

    • 인스턴스는 2단계 체크아웃을 사용합니다. 2단계 체크아웃이 활성화되지 않은 경우 시작하기 전에 활성화하십시오. 자세한 내용은 Service Catalog checkout models 문서를 참조하십시오.
    • 이 예에서는 서비스 카탈로그 요청 양식에서 회사 필드를 채웁니다. 필드가 양식에 나타나지 않으면 시작하기 전에 양식을 구성하십시오. 지침은 Personalize a form 문서를 참조하십시오.

    프로시저

    1. 시스템 UI > UI 매크로로 이동하여 servicecatalog_cart_template 선택합니다.
    2. 선언된 숨겨진 변수가 있는 위치를 찾아 다음 줄을 추가합니다.
      <input type="HIDDEN" name="cart_id" id="cart_id" value="$[sc_cart.sys_id]" />
    3. Requested For 코드를 생성하는 다음 코드를 찾습니다.
      <tr class="header">
      <td width = "30%">
        ${gs.getMessage('Requested for')}:
        </td>
        <td width="70%">
          <label for="requestor_location">${gs.getMessage('Deliver to')}:</label>
        </td>
      </tr>
      <tr><td>$[SP]</td> 
      </tr>
        <tr><td valign="top">
          <j2:if test="$[jvar_can_delta_rf == false]">
            $[sc_cart.requested_for.getDisplayValue()]
          </j2:if>
          <j2:if test="$[jvar_can_delta_rf != false]">
            <g2:catalog_requested_for />
          </j2:if>
        </td>
        <td>
          <textarea id="requestor_location" style="width:100%" rows="4"       name="requestor_location" wrap="soft" onChange="catDeliveryAddress('$[sc_cart.sys_id]', 'requestor_location');"> 
            $[sc_cart.delivery_address]
          </textarea>
        </td>
      </tr>
      <tr>
        <td>$[SP]</td>
      </tr>
    4. 나중에 다음 코드를 추가하십시오.
      <tr class="header">
        <td colspan="2">Company</td>
      </tr>
      <tr>
        <td>$[SP]</td>
      </tr>
      <tr>
        <td colspan="2">
          <g2:ui_reference name="core_company" table="core_company" onchange="setCartValue()"/>
        </td>
      </tr>
      <tr>
        <td>$[SP]</td>
      </tr>
      주:
      'ui_reference' 매크로는 참조 필드를 정의합니다. 다양한 필드 유형에 대한 여러 매크로가 있습니다. System UI -> UI 매크로에서 이러한 필드 유형의 예를 볼 수 있습니다. 이러한 매크로는 'ui_'로 시작합니다. 이 예시에서 생성된 참조 필드의 이름은 core_company입니다. 자세한 내용은 UI 매크로 문서를 참조하십시오.
    5. 이제 시스템 UI > UI 페이지로 이동하여 servicecatalog_checkout_one UI 페이지를 선택합니다.
    6. 클라이언트 스크립트 필드에 다음 스크립트를 추가합니다.
      function setCartValue() { 
        var newField = gel('core_company'); 
        var myCart = gel('cart_id'); 
        var cart_item = new GlideRecord('sc_cart_item');
        cart_item.addQuery('cart', myCart.value);
        cart_item.query(); 
        if(cart_item.next()) {
          cart_item.hints = "<hints><entry key='sysparm_processing_hint' value='setfield:request.company=" + newField.value + "'/></hints>";
          cart_item.update(); 
        } 
      }

      이 예시에서는 참조 필드가 core_company이며, 요청에서 채워지는 필드는 company입니다. 다른 필드를 사용하는 경우:

      • 다음 줄을 찾으십시오. var company = gel('core_company');그리고 core_company 체크 아웃의 필드 이름으로 바꿉니다.
      • 'cart_item.hints'로 시작하는 줄에서 'request.company'를 생성 중인 요청이고 'company'가 필드 이름인 요청 티켓에 채울 필드의 이름으로 바꿉니다.

    결과

    항목을 주문하면 카탈로그 양식에 회사 필드가 나타납니다.

    서비스 카탈로그 체크 아웃에 추가된 필드

    자동 채우기 기능 추가

    자동 채우기 기능 추가는 인시던트 템플릿, 자동 할당, 빠른 호출, 통화 스크립트 또는 자동 채우기라고도 합니다.

    선택한 하위 범주에 따라 간단한 설명 필드를 자동으로 채우려면 다음을 수행합니다.
    1. 조회 테이블을 생성합니다.
    2. 하위 범주 키 필드를 채웁니다.
    3. 자동 채워진 필드, 짧은 설명을 채웁니다.
    function onChange(control, oldValue, newValue, isLoading) { 
      if (isLoading) { return; } 
      var newrec = gel('sys_row');
      //Check if new record
      if (newrec.value == -1) { 
        var lookup = new GlideRecord('u_short_desc_lookup'); 
        lookup.addQuery('u_subcategory', g_form.getValue('subcategory'));
        lookup.query();
        var temp; //temp var - reusable
        if (lookup.next()) {
          temp = lookup.u_short_description;
            if (null != temp) { //Set the form value from lookup if there is a lookup value
              g_form.setValue('short_description', temp); } 
            else {
              g_form.setValue('short_description', "" ); } } 
       else { 
         //If a lookup record does not exist based on lookup.addQuery 
         //Then set to UNDEFINED or NULL depending on type
          g_form.setValue('short_description', ""); } } 
    }

    많은 필드를 채우거나 콜 스크립트 질문을 의견 필드에 끌어와 콜 센터 직원이 기술자에게 전달할 좋은 정보를 수집할 수 있습니다.

    필드를 암호 재설정으로 설정
    조회 테이블에는 다음 키 및 자동 채우기 설정이 포함된 기록이 있습니다.
    • 하위 범주 = 암호
    • 간단한 설명 = 암호 재설정
    클라이언트 스크립트 설정:
    • 유형 = onChange
    • 테이블 이름 = incident
    • 필드 이름 = Subcategory

    사용자가 인시던트 양식에서 암호 의 하위 범주를 선택하면 클라이언트 스크립트가 일치하는 기록을 조회하고 짧은 설명을 암호 재설정과 동일하게 설정합니다.

    상태 변경 시 양식 색상 변경

    상태 변경 시 양식의 양식 필드 색상이 변경됩니다. HTML DOM을 통해 액세스할 수 있는 페이지에 있는 모든 객체의 속성을 조정하도록 스크립트를 쉽게 변경할 수 있습니다.

    경고:
    여기서 설명하는 사용자 지정은 특정 인스턴스에서 사용하도록 개발되었으며, Now Support에서 지원되지 않습니다. 이 메서드는 있는 그대로 제공되며 구현 전에 철저히 테스트되어야 합니다. 이 사용자 지정에 대한 모든 질문과 의견을 커뮤니티 포럼에 게시합니다.

    이름: 상태 변경 시 양식 색상 변경

    유형: 클라이언트 스크립트

    설명: 상태 변경 시 양식의 양식 필드 색상을 변경합니다. HTML DOM을 통해 액세스할 수 있는 페이지에 있는 모든 객체의 속성을 조정하도록 스크립트를 쉽게 변경할 수 있습니다.

    스크립트:
    function onChange(control, oldValue, newValue, isLoading) { 
      var elementID = gel("incident.priority");
        switch(newValue) { 
          case "1": elementID.style.backgroundColor = "red"; break; 
          case "2": elementID.style.backgroundColor = "tomato"; break;
          case "3": elementID.style.backgroundColor = "orange"; break;
          case "4": elementID.style.backgroundColor = "yellow"; break;
          case "5": elementID.style.backgroundColor = "green"; break; 
          default: elementID.style.backgroundColor = "white"; break; } }

    UI 라우팅 작업 생성

    이 솔루션을 사용하면 인시던트인지 요청 항목인지 모른 채 서비스 데스크에 기록을 만들 수 있습니다. 그러면 서비스 데스크에서 기록을 적절한 테이블로 라우팅할 수 있습니다.

    시작하기 전에

    필요한 역할: admin

    프로시저

    1. 작업 테이블을 확장하는 새 테이블을 만듭니다(예: New Call).
    2. 모듈을 생성하여 새 새 통화 기록을 생성합니다.
    3. 새 호출 테이블에 원하는 필드를 작성합니다.

      필요한 필드는 새 호출이 인시던트 또는 요청 항목으로 라우팅되어야 하는지 여부를 결정하는 데 필요한 필드뿐입니다. 인시던트 또는 요청 항목에 전달할 필드가 양식에 포함되어 있는지 확인합니다. 이 예에서는 양식에 다음이 만들어집니다.

      • 요청 대상 (참조)
      • 위치 (참조)
      • 콜 유형 (두 가지 값, 인시던트 및 요청이 있는 선택)
      • 요청 항목 ( sc_cat_item 항목 테이블 참조)
    4. 몇 가지 UI 정책을 추가하여 몇 개의 필드를 필수로 설정하고 콜 유형 선택에 따라 요청 항목 필드를 숨깁니다.
    5. 양식에서 불필요한 버튼과 기능을 제거합니다.
    6. 새 UI 작업 버튼을 생성합니다.
      이 버튼을 누르면 사용자가 인시던트 또는 요청으로 리디렉션됩니다. 또한 인시던트 기록을 생성하고 값을 인시던트 및 요청 항목 양식에 복사합니다.
      var reqItem = current.u_item;
      var requestedFor = current.u_requested_for;
      var location = current.location;
      
      if(current.u_incident_request == 'Incident'){
        //Create a new incident record and redirect to the new incident
        var rec = new GlideRecord('incident');
        rec.initialize();
        rec.caller_id = requestedFor;
        rec.location = location;
        rec.insert();
        action.setRedirectURL(rec);
      }
      
      if(current.u_incident_request == 'Request'){
        //Build the url and route the user to the request item
        var url = '';
        if(current.u_item.sys_class_name == 'sc_cat_item_guide'){
          url = 'com.glideapp.servicecatalog_cat_item_guide_view.do?sysparm_initial=true&sysparm_guide=' + 
            reqItem + '&sysparm_user=' + requestedFor + '&sysparm_location=' + location;
        }
        else{
          url = 'com.glideapp.servicecatalog_cat_item_view.do?sysparm_id=' + reqItem + '&sysparm_user=' +  
            requestedFor + '&sysparm_location=' + location;
        }
        action.setRedirectURL(url);
      }
    7. 앞 예제의 경로 단추는 URL의 요청 대상위치 값을 요청 항목 양식에 전달합니다.
      다음 클라이언트 스크립트를 사용하여 이러한 값을 매핑하는 항목, 기록 생성자 또는 주문 가이드에 requested_for위치 라는 변수가 있는지 확인합니다. URL의 길이가 제한되어 있으므로 전달할 수 있는 정보의 양에 제한이 있습니다. 이 방법을 사용하여 긴 텍스트 필드에서 정보를 보내지 마십시오.
      function onLoad() {
        var url = document.location.toString();
        var userKey = 'sysparm_user=';
        var locKey = 'sysparm_location=';
        var userPosition = url.indexOf(userKey);
        var locPosition = url.indexOf(locKey)
        if (userPosition != -1) {
          var user = url.substr(userPosition+userKey.length, 32);
          g_form.setValue('requested_for', user);
        }
        if (locPosition != -1) {
          var loc = url.substr(locPosition+locKey.length, 32);
          g_form.setValue('location', loc);
        }
      }

    필드 메시지 표시

    JavaScript alert()를 사용하는 대신 폼 자체에 오류를 표시할 수 있습니다. showFieldMsg()hideFieldMsg() 메서드를 사용하여 필드 바로 아래에 메시지를 표시할 수 있습니다.

    showFieldMsghideFieldMsgg_form 객체와 함께 사용할 수 있는 메서드입니다.

    이러한 방법은 기록(인시던트, 문제 및 변경 양식)의 양식 뷰를 변경하는 데 사용됩니다. 이러한 메서드는 다른 클라이언트 스크립트에서도 사용할 수 있지만 예상대로 작동하는지 확인하려면 테스트해야 합니다.

    로드 시 양식에 필드 메시지가 표시되면 양식이 스크롤되어 필드 메시지가 표시되는지 확인합니다. 화면 밖에 있었기 때문에 사용자가 필드 메시지를 놓치지 않도록 합니다.

    전역 속성 glide.ui.scroll_to_message_field 는 양식 필드가 화면을 벗어날 때(양식을 컨트롤이나 필드로 스크롤) 자동 메시지 스크롤을 제어합니다.

    표 1. 메서드 상세 정보
    메서드 상세 정보 매개변수 예제
    showFieldMsg(입력, 메시지, 유형, [스크롤폼])
    • input — 필드 또는 컨트롤의 이름
    • message — 표시할 메시지
    • type — '정보', '오류' 또는 '경고'; 제공되지 않은 경우 기본적으로 정보로 설정됩니다.
    • scroll form — (선택 사항) 화면 밖의 필드 메시지로 스크롤되지 않도록 scrollForm 을 false로 설정합니다.

    오류 메시지

    g_form.showFieldMsg('impact','Low impact not allowed with High priority','error');

    높은 우선순위 메시지와 함께 낮은 영향은 허용되지 않습니다.

    정보 메시지

    g_form.showFieldMsg('impact', 'Low impact response time can be one week','info');
    //or this defaults to info type
    //g_form.showFieldMsg('impact', 'Low impact response time can be one week');

    영향도가 낮은 응답시간은 1주일 메시지일 수 있습니다.

    hideFieldMsg(입력)
    • input — 필드 또는 컨트롤의 이름
    • clearAll — (선택 사항) 모든 메시지를 지울지 여부를 나타내는 부울 매개 변수입니다. 예일 경우 필드에 대한 모든 메시지가 지워집니다. false이거나 비어 있는 경우 첫 번째 메시지만 제거됩니다.
    메시지 제거
    //this will clear the first message printed to the field
    g_form.hideFieldMsg('impact');

    레거시 지원

    showErrorBox()hideErrorBox() 메서드는 권장되지 않습니다.

    UI 동작에서 클라이언트 및 서버 코드 사용

    서버 측에서 기록을 업데이트하기 전에 스크립트를 사용하면 클라이언트 측에서 UI 작업을 클릭할 때 입력을 확인할 수 있습니다. 사용자는 필수 필드를 확인하고 기록을 업데이트하기 위해 버튼을 두 번 클릭하지 않아도 됩니다.

    스크립트는 클라이언트 측 확인을 위해 클라이언트 함수를 호출하고, 통과하면 UI 작업이 작업을 완료합니다. onclick 문 없이 실행되는 코드는 클라이언트 함수가 더 이상 실행되지 않을 때까지 서버 측 함수가 실행되지 않도록 합니다. 성공하면 서버 측 기능이 실행되고 레코드가 업데이트됩니다.

    // Client-side onclick function
    function resolveIncident() {
      // Set the 'Incident state' and 'State' values to 'Resolved', and display mandatory fields
      g_form.setValue('incident_state', 6);
      g_form.setValue('state', 6);
      g_form.setValue('resolved_by', g_user.userID);
    
      // Call the UI action and skip the 'onclick' function
      gsftSubmit(null, g_form.getFormElement(), 'resolve_incident'); //MUST call the 'Action name' set in this UI Action
    }
    
    // Code that runs without 'onclick'
    // Ensure call to server-side function with no browser errors
    if (typeof window == 'undefined')
      serverResolve();
    
    // Server-side function
    function serverResolve() {
      current.incident_state = IncidentState.RESOLVED;
      current.state = IncidentState.RESOLVED;
      current.resolved_by = gs.getUserID();
      current.update();
    }

    gsftSubmit(문자열 제어, 객체 형식, 문자열 action_name)

    필수 필드를 확인하고 onSubmit() 클라이언트 스크립트를 실행한 후 사용자가 UI 작업을 클릭한 것처럼 양식을 제출합니다. 단일 UI 작업에서 클라이언트 측 코드 및 서버 측 코드를 호출할 수 있습니다.

    표 2. 매개변수
    이름 유형 설명
    제어 문자열 사용자 클릭을 시뮬레이트할 양식 버튼의 이름입니다. 그렇지 않으면 null 을 사용합니다.
    양식 객체 옵션입니다. 제출된 입력을 포함하는 양식 요소입니다. g_form.getFormElement() 메서드를 호출하여 이 값을 검색할 수 있습니다.
    action_name 문자열 작업 이름입니다. 이 값은 UI 작업 [sys_ui_action] 테이블에 나열된 기록에 제공됩니다.

    예를 들어 'resolve_incident' 는 인시던트 [incident] 테이블에 있는 해결 버튼의 작업 이름입니다.