# 게시판을 Pro Page에 적용하는 방법

<p class="callout info">1대1문의 (문의형 게시판)을 pro page에 적용하기</p>

##### **\[문의형 게시판 - 1대1 문의 적용하기 예제\]**

#### **1. Controller 구성**

`pro` 테마에 `Controller`를 구성합니다. `dabory/themes/pro/app/Http/Controller/etc` 디렉토리에 `OneToOneController.php`를 생성하고 메서드를 작성합니다.

#### **- 외부 API 호출 설정**

백엔드 API를 호출하고 결과를 처리하기 위해 `App\Services\CallApiService`를 사용합니다.

```
class OneToOneController extends Controller
{
    private $callApiService;


    public function __construct(CallApiService $callApiService)
    {
        $this->callApiService = $callApiService;
    }


    public function list()
    {
        $limit = (int)request('limit', 12);
        $page = (int)request('page', 1);

        $oneToOnePage = $this->callApiService->callApi([
            'url' => 'list-type1-page',    // api에 요청할 url 주소
            'data' => [                    // list-type1-page로 요청할 data
                'QueryVars' => [           // api 서버에서 Query를 식별할 수 있도록 구성한 요소들
                    'QueryName' => 'pro:my-page/post-list',   // pro/.../my-page/post-list/ 디렉토리 안의 쿼리 파일을 찾는다.
                    'SimpleFilter' => "post_code='1to1'",     // where 절에 추가
                    'SubSimpleFilter' => "image_type = 'thumb'", 
                    'IsntPagination' => false     // pagination 여부
                ],
                'ListType1Vars' => [
                    'OrderBy' => request('sort', 'mx.created_on desc')
                ],
                'PageVars' => [
                    'Limit' => $limit,
                    'Offset' => ($page - 1) * $limit
                ]
            ]
        ]);


    //    dump($oneToOnePage);


        $oneToOnePage['Page'] = new LengthAwarePaginator($oneToOnePage['Page'], $oneToOnePage['PageVars']['QueryCnt'],
            $limit, $page, ['path' => request()->url()]);
        // dump($oneToOnePage);
        return view('views.etc.1to1-list', compact('oneToOnePage'));
    }


    public function store()
    {
        $validator = Validator::make(request()->all(), [
            'post_title' => 'required',
            'post_contents' => 'required',
            'pc1' => 'required',
            'pc2' => 'required|email'
        ]);


        if ($validator->fails()) {
            notify()->error(_e('Action failed'), 'Error', 'bottomRight');
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }


        $response =  $this->callApiService->callApi([
            'url' => 'post-act',
            'data' => [
                'Page' => [
                    [
                        'Id' => 0,
                        'PostTitle' => request('post_title'),
                        'PostContents' => request('post_contents'),
                        'PostTypeId' => 6,
                        'Pc1' => request('pc1'),
                        'Pc2' => request('pc2'),
                        'Status' => '2',
                        'MemberId' => session('member')['MemberId'],
                    ]
                ]
            ],
        ]);


        if ($this->callApiService->verifyApiError($response)) {
            notify()->error($response['body'], 'Error', 'bottomRight');
            return redirect()->back();
        }


//        notify()->success(_e('Action completed'), 'Success', 'bottomRight');
        return redirect()->route('1to1.list');
    }


    public function show($id)
    {
        $listType1Book = $this->callApiService->callApi([
            'url' => 'list-type1-book',
            'data' => [
                'Book' => [
                    [
                        'QueryVars' => [
                            'QueryName' => 'pro:my-page/post-details',
                            'SimpleFilter' => "post_code='1to1' and mx.id = $id",
                            'IsntPagination' => true,
                        ],
                        'PageVars' => [
                            'Limit' => 1
                        ]
                    ],
                    [
                        'QueryVars' => [
                            'QueryName' => 'pro:my-page/post-details-prenext',
                            'SimpleFilter' => "mx.id = (select max(id) from pro_post where id < ${id} and post_type_id = 6)",
                            'SubSimpleFilter' => "",
                            'IsntPagination' => true,
                        ],
                        'PageVars' => [
                            'Limit' => 1
                        ]
                    ],
                    [
                        'QueryVars' => [
                            'QueryName' => 'pro:my-page/post-details-prenext',
                            'SimpleFilter' => "mx.id = (select min(id) from pro_post where id > ${id} and post_type_id = 6)",
                            'SubSimpleFilter' => "",
                            'IsntPagination' => true,
                        ],
                        'PageVars' => [
                            'Limit' => 1
                        ]
                    ],
                ]
            ]
        ]);


    //    dd($listType1Book);
        if ($this->callApiService->verifyApiError($listType1Book)) {
            notify()->error($listType1Book['body'], 'Error', 'bottomRight');
            return redirect()->back();
        }


//        dump($listType1Book);
        return view('views.etc.1to1-details', compact('listType1Book'));
    }
}
```

<div id="bkmrk-1%EB%8C%801%EB%AC%B8%EC%9D%98-%EA%B5%AC%ED%98%84%EC%9D%84-%EC%9C%84%ED%95%9C-control">1대1문의 구현을 위한 Controller 예시</div><div id="bkmrk-"></div><div id="bkmrk--1">  
</div><div id="bkmrk-%EC%9D%B4-%EA%B5%AC%EC%84%B1%EC%9C%BC%EB%A1%9C-list-type1-pa">이 구성으로 `list-type1-page` URL로 data가 요청되면, api 서버는 `weberp-queries`에서 해당 URL의 QueryVars에 작성해준 조건에 해당하는 SQL 파일을 찾고, 데이터로 쿼리 조건절을 구성하여 호출하고 반환합니다.</div><div id="bkmrk--2"></div>#### **응답 처리 및 View 반환**

API로부터 응답을 받아 변수에 담고, View 페이지에서 필요한 데이터를 가공하거나 변환하여 반환합니다. View 페이지에서는 반환받은 배열 데이터를 통해 페이지 작업을 수행할 수 있습니다.

#### **TEST**

Controller와 view 페이지 작업이 완료되었다면 erp/pro 각각의 페이지에서 테스트를 진행합니다.

예제에서 진행했던 1대1문의 게시판을 확인해보겠습니다.

pro 페이지에 만들어준 문의하기 게시판에서 문의글을 작성한 뒤

[![image.png](https://manual.dabory.com/uploads/images/gallery/2024-07/scaled-1680-/aHOimage.png)](https://manual.dabory.com/uploads/images/gallery/2024-07/aHOimage.png)

erp 페이지로 이동하여 1대1문의 게시판을 확인합니다.

[![image.png](https://manual.dabory.com/uploads/images/gallery/2024-07/scaled-1680-/z5Iimage.png)](https://manual.dabory.com/uploads/images/gallery/2024-07/z5Iimage.png)

위와같이 문의내용이 잘 들어왔습니다.

<details id="bkmrk-%EC%B0%B8%EA%B3%A0%EC%82%AC%ED%95%ADerp%EC%97%90-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0"><summary>참고사항</summary>

erp에 게시판 설치하기

[erp 게시판 커스터마이징](https://manual.dabory.com/books/frontend/page/01386)

</details><div id="bkmrk-%27url%27-%3D%3E-%27list-type1"></div><div id="bkmrk-%EC%9D%B4%EC%A0%9C-%EB%B0%9B%EC%95%84%EC%98%A8-%EC%9D%91%EB%8B%B5%EC%9D%84-%EB%B3%80%EC%88%98%EC%97%90-%EB%8B%B4%EA%B3%A0%C2%A0-v"></div>