카테고리 없음

VisualforcePage 로 dataTable 그리기

으농농이 2024. 5. 17. 11:27

 

지난 포스팅에서 LWC 를 활용해서 dataTable 을 만들었는데 이것과 똑같이 vfpage 만들어보려고 한다 

(포스팅 참조: https://nnn-ong.tistory.com/243)

컨트롤러는 동일하게 활용하겠다 

 

먼저 vfpage 를 만든다 

 

visualforcePage는 1페이지에서 모든게 관리되기때문에 

기본 폼으로 덩어리를 나눠놓고 시작해야한다. 

 

제일 상단부분은 컨트롤러선언 

<apex:page controller="tableSampleController">

그 아래는 스타일 , 스크립스 , html 차례대로 선언하면 된다. 

아래와 같이 js 에 window.onload 부분은 vfpage가 켜지자 마자 바로 실행되는 함수이다. 

lwc 로 따지면 connectedcallback 과 같은느낌 

vfpage js를 사용하려면 function 함수명(){} 으로 선언해서 쓰면되고, 아래와 같은 방식으로 함수명을 선언하여 

활용하면된다. 

    <!-- JS -->
    <script type="text/javascript">

        window.onload = function(){
            init();
        };

        function init(){
            console.log(' vf가 켜지면서 바로 실행됩니다 ');
            // 함수명을 입력하여 js를 사용
 
        }

    </script>

 

html 을 입력하여 table 을 기릴 수 있다. 

<!-- html -->
    <html>
        <h1> ▼ VF로 만든 데이터테이블 화면입니다</h1>
        <table class="custTable" style="width:100%">
            <colgroup>
                <col width="5%"/>
            </colgroup>
            <!-- 헤더 -->
            <thead>
                <tr>
                    <th>No</th>
                    <th>이름</th>
                    <th>폰번호</th>
                    <th>이메일</th>
                </tr>
            </thead>
            <!-- 내용 -->
            <tbody>
                <apex:repeat value="{!contactMap}" var="item">
                    <tr>
                        <td>{!item}</td>
                        <td>{!contactMap[item].LastName}</td>
                        <td>{!contactMap[item].Email}</td>
                        <td>{!contactMap[item].MobilePhone}</td>
                    </tr>
                </apex:repeat>
            </tbody>
        </table>
    </html>

 

LWC 같은경우는아래와같이  for:each를 사용해서 for 문을 돌리면되지만 vfpage 에서는 <apex:repeat > 를 사용한다.

LWC 테이블 for문

 

contactMap 같은 데이터는 전부 controller 에서 데이터를 말아놓는다. 

vfpage  에서 작성한 데이터를  controller 에 전송 (DML 처리) 하는 경우는@RemoteAction 이라는 어노테이션을 사용한다. controller 에서 vfpage로 넘기는 데이터는 어노테이션을 사용하지 않아도된다. 

 

[ controller 공유]

LWC 에서는  @AuraEnabled 어노테이션을 사용하여 컨트롤러 메소드를 호출했지만 

VF에서는 화면이 켜지는 동시에 controller 가 호출되다보니 , 메소드를 만들고 그 매소드를 실행을 해줘야 

컨트롤러가 동작한다. (아래 getContactVf 참고) 

 

vfpageTable.page 가 호출되면서 -> tableSampleController 가 호출 -> 말아진 데이터를 vf에 가져와서 화면에 노출 

하는 과정으로 동작한다. 

public with sharing class tableSampleController {

    public Map<Integer,Object> contactMap {get; set;}  
   
    public tableSampleController(){
        contactMap = new Map<Integer, Object>();
        getContactVf();
    }

    /*
    LWC 전용
    연락처(Contact)정보 가져오기
    */
    @AuraEnabled
    public static List<Contact> getContactData(){
        List<Contact> con = [ SELECT id , LastName , email , MobilePhone FROM Contact WHERE MobilePhone !=null LIMIT 1000 ];
        return con;
    }
   
    /*
    VisualForcePage 전용
    연락처(Contact)정보를 가져와서 반환
    */
    public void getContactVf(){
        System.debug(' vf 실행 ~ ');
        List<Contact> con = getContactData();
        Integer seq = 1;
        for(Contact contact : con){
            contactMap.put(seq,contact);
            seq++;
        }
 
    }

}

 

[vfpage 코드공유]

 

<apex:page controller="tableSampleController">
   
    <!-- 스타일 -->
    <style>
        .custTable {
            border-collapse: collapse;
        }
        .custTable th, .custTable td {
            border: 1px solid rgb(255, 255, 255);
            padding: 8px;
        }

        .custTable thead tr th {
            background-color: #c71616;
            /* color: aliceblue; */
        }

        /* 바디부분 적용 CSS */
        .custTable tbody tr{
            background-color: rgb(243, 243, 243);
        }

        /* 바디부분 테이블에 줄무늬 넣기 */
        .custTable tbody tr:nth-child(2n-1){
            background-color: rgb(210, 211, 210);
        }

    </style>

    <!-- JS -->
    <script type="text/javascript">

        window.onload = function(){
            init();
        };

        function init(){
            console.log(' vf가 켜지면서 바로 실행됩니다 ');
        }

    </script>

    <!-- html -->
    <html>
        <h1> ▼ VF로 만든 데이터테이블 화면입니다</h1>
        <table class="custTable" style="width:100%">
            <colgroup>
                <col width="5%"/>
            </colgroup>
            <!-- 헤더 -->
            <thead>
                <tr>
                    <th>No</th>
                    <th>이름</th>
                    <th>폰번호</th>
                    <th>이메일</th>
                </tr>
            </thead>
            <!-- 내용 -->
            <tbody>
                <apex:repeat value="{!contactMap}" var="item">
                    <tr>
                        <td>{!item}</td>
                        <td>{!contactMap[item].LastName}</td>
                        <td>{!contactMap[item].Email}</td>
                        <td>{!contactMap[item].MobilePhone}</td>
                    </tr>
                </apex:repeat>
            </tbody>
        </table>
    </html>
   
</apex:page>

 

완성!  아래와 같이 노출이 된다 . 

다음포스팅에선 이 vfp 를 lwc 에 임배드하는것을 작성하겠다