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

{% 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 ...
    }
}
```
