# 컨트롤러 커스터마이징 방법

{% hint style="danger" %} <mark style="color:red;">**개발 가이드를 준수하지 않아 발생하는 모든 문제는 전적으로 이용자에게 책임이 있습니다!**</mark>
{% endhint %}

## 📌 Controller 제공 절대상수 <a href="#controller" id="controller"></a>

<table><thead><tr><th width="276">상수 이름</th><th>상수 설명</th></tr></thead><tbody><tr><td>PATH_DATA</td><td>데이터 폴더의 경로 <code>/data/</code></td></tr><tr><td>PATH_ADMIN_SKIN</td><td>관리자 스킨의 경로 <code>/admin/</code></td></tr><tr><td>PATH_ADMIN_GD_SHARE</td><td>관리자 공통 리소스 경로 <code>/admin/gd_share/</code></td></tr><tr><td>PATH_SKIN</td><td>프론트에 적용된 라이브 스킨의 경로 <code>/data/skin/front/[스킨명]/</code></td></tr><tr><td>PATH_SKIN_WORK</td><td>프론트에 적용된 작업 스킨의 경로 <code>/data/skin/front/[스킨명]/</code></td></tr><tr><td>PATH_MOBILE_SKIN</td><td>모바일에 적용된 라이브 스킨의 경로 <code>/data/skin/front/[스킨명]/</code></td></tr><tr><td>PATH_MOBILE_SKIN_WORK</td><td>모바일에 적용된 작업 스킨의 경로 <code>/data/skin/front/[스킨명]/</code></td></tr><tr><td>USERPATH_SKIN</td><td><code>/data/skin/front/[스킨명]/</code></td></tr><tr><td>USERPATH_SKIN_ADMIN</td><td><code>/admin/</code></td></tr><tr><td>USERPATH_SKIN_MOBILE</td><td><code>/data/skin/mobile/[스킨명]/</code></td></tr><tr><td>URI_HOME</td><td>현재 도메인 링크 <code>http://example.godomall.com/</code></td></tr><tr><td>URI_SHARE</td><td>현재 도메인의 share 링크 <code>http://example.godomall.com/share/</code></td></tr><tr><td>URI_ADMIN</td><td>관리자 도메인 <code>http://gdadmin.example.godomall.com/</code></td></tr><tr><td>URI_PROVIDER</td><td>공급사 관리자 도메인 <code>http://gdadmin.example.godomall.com/provider/</code></td></tr><tr><td>URI_MOBILE</td><td>모바일 도메인 <code>http://m.example.godomall.com/</code></td></tr><tr><td>URI_API</td><td>API 도메인 <code>http://api.example.godomall.com/</code></td></tr></tbody></table>

## 📌 Controller 제공 메소드 <a href="#controller" id="controller"></a>

### **download**

```php
download($path, $newFile)
```

* `$path`의 파일을 `$newFile`이라는 이름으로 다운로드를 실시합니다.

### **json**

```php
json($data)
```

* `$data`가 비어있는 경우 `Controller` 내 `data` 를 `json`으로 변경하고 `$data`가 있는 경우 `json`을 출력하고 `exit` 처리됩니다.

### **streamedDownload**

```php
streamedDownload($path)
```

* `$path`로 `index()`에 출력하는 모든 버퍼를 파일로 저장합니다.

### **redirect**

```php
redirect($uri, $title = null, $target = 'self')
```

* 페이지를 특정 URI로 이동시킵니다. 일반적으로 동일한 프레임에서 작동하며 iframe이 타겟인 경우는 사용하시면 안됩니다.

### **alert**

```php
alert($message, $history = null, $url = null, $target = null, $addScript = null)
```

* Alert 창을 출력하며 출력 후 `exit` 처리됩니다.

### **js**

```php
js($script)
```

* `$script` 텍스트로 사용자 정의 스크립트를 작성하실 수 있습니다.

### **layer**

```php
layer($message = null, $addScript = null, $timeOut = 3000)
```

* 관리자 컨트롤러에서만 사용할 수 있습니다.
* 레이어를 출력할 수 있으며, 레이어 출력이후 레이어를 닫으면 페이지가 새로고침 됩니다.

### **layerNotReload**

```php
layerNotReload($message = null, $addScript = null, $timeOut = 2000)
```

* 관리자 컨트롤러에서만 사용할 수 있습니다.
* 레이어를 출력할 수 있으며, 레이어 출력이후 레이어를 닫아도 페이지가 새로고침 되지 않습니다.

### **addMeta**

```php
addMeta(array $metaTags)
```

* 스킨의 헤더에 메타태그를 추가할 수 있습니다.
* `front`와 `mobile`에서만 사용가능하며 `admin`에서는 사용할 수 없습니다.

### **addCss**

```php
addCss(array $styles, $isShare = false)
```

* 스타일시트의 경로를 배열로 받아서 스킨 상단에 출력합니다.
* `$isShare`를 `true`로 하는 경우 `/data/assets`에 있는 공유 리소스를 사용하실 수 있습니다.

### **addScript**

```php
addScript(array $scripts, $isShare = false, $isFooter = false)
```

* 스크립트의 경로를 Array로 받아서 스킨 상/하단에 출력합니다. (ex. `['common.js', 'common2.js']`)
  * 경로는 `/data/[skin path]/js`에 있는 공유 리소스를 사용하실 수 있습니다.
* `$isShare`를 `true`로 하는 경우 `/data/assets`에 있는 공유 리소스를 사용하실 수 있습니다.
* `$isFooter`를
  * true로 하는 경우 스킨내 `{footerScript}` 치환코드로 반환합니다.
  * false인 경우 스킨내 `{headerScript}` 치환코드로 반환합니다.

### **callMenu**

```php
callMenu($topMenu, $midMenu, $thisMenu)
```

* 관리자 메뉴 데이터를 생성합니다.
* 관리자 메뉴를 새로 추가할 경우, 추가할 메뉴 페이지에 해당되는 컨트롤러 내에서 해당 함수를 호출합니다.
* `es_adminMenu` 테이블에 추가할 메뉴 데이터를 `insert`한 후에 1차 메뉴(`$topMenu`), 2차 메뉴(`$midMenu`), 3차 메뉴(`$thisMenu`) 파라미터 대로 메소드를 호출합니다.

## 📌 사용자 정의 Controller 기본 메소드 <a href="#controller" id="controller"></a>

* 고도몰에서는 기본적으로 3개의 사용자 정의 Method를 제공합니다.
* Method 종류
  1. `pre()`
     * 시스템 전 처리기 `interceptor`의 실행 직전에 실행됩니다.
  2. `index()`
     * 사용자가 처리할 내용을 작성할 수 있습니다.
  3. `post()`
     * 시스템 후 처리기 `interceptor`의 실행 직후에 실행됩니다.
* 실제 코드 확인하시고 아래와 같이 사용하시면 됩니다.

```php
<?php
namespace Controller\Front\Test

class MyController extends \Controller\Front\Controller
{
    public function pre()
    {
        // interceptor 실행 이전 실행할 로직 구현
    }
    
    public function index()
    {
        // 사용자 정의 로직 구현
    }
    
    public function post()
    {
        // interceptor 실행 이후 실행할 로직 구현
    }
}
```

## 📌 전역으로 사용할 수 있는 사용자 정의 Controller <a href="#controller" id="controller"></a>

* 모든 페이지에 공통으로 적용할 수 있는 사용자 정의 컨트롤러를 생성할 수 있습니다.
* 프론트는 `module\Controller\Front` 경로에 `CommonController` 클래스를 생성해 주신 후 아래와 같이 사용하시면 됩니다.

```php
<?php
namespace Controller\Front;

/**
 * 사용자들이 모든 컨트롤러에 공통으로 사용할 수 있는 컨트롤러 Class
 * 컨트롤러에서 지원하는 메소드들을 사용할 수 있습니다.
 */
class CommonController
{
    public function index($controller)
    {
        /**
         * IP를 추가합니다.
         * 스킨에서 {=remoteAddr} 치환코드로 사용 가능합니다.
         */ 
        $controller->setData('remoteAddr',\Request::server()->get('REMOTE_ADDR'));
        
        /**
         * 새 변수를 추가합니다.
         * 스킨에서 {=userName} 치환코드로 사용 가능합니다.
         */
        $controller->setData('userName', '사용자 이름');
    }
}
```

* 모바일은 `module\Controller\Mobile` 경로에 `CommonController` 클래스를 생성해 주신 후 아래와 같이 사용하시면 됩니다.

```php
<?php
namespace Controller\Mobile;

/**
 * 사용자들이 모든 컨트롤러에 공통으로 사용할 수 있는 컨트롤러 Class
 * 컨트롤러에서 지원하는 메소드들을 사용할 수 있습니다.
 */
class CommonController
{
    public function index($controller)
    {
        /**
         * IP를 추가합니다.
         * 스킨에서 {=remoteAddr} 치환코드로 사용 가능합니다.
         */ 
        $controller->setData('remoteAddr',\Request::server()->get('REMOTE_ADDR'));
        
        /**
         * 새 변수를 추가합니다.
         * 스킨에서 {=userName} 치환코드로 사용 가능합니다.
         */
        $controller->setData('userName', '사용자 이름');
    }
}
```

## 📌 Api 사용자 정의 Controller <a href="#api-controller" id="api-controller"></a>

* Api 통신이 가능한 사용자 정의 컨트롤러를 생성할 수 있습니다.
* `module/Controller/Api` 경로에서 사용하시면 됩니다. 만약 디렉토리가 없다면 생성하고 `chmod 707` 변경 필수
* `Front/Mobile` 커스터마이징과 동일한 방법으로 `Controller` 생성
* 생성 예시
  * 경로: `module/Controller/Api/Load/GetApiController.php`
  * 링크: `api.{상점도메인}/load/get_api`

```php
<?php
namespace Controller\Api\Load;

class GetApiController extends \Controller\Api\Controller
{
    public function index()
    {
        // some code ...
    }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devcenter-help.nhn-commerce.com/guide/tuning/source-code/controller.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
