# 관리자 메뉴 추가하기

## 📌 요구사항 및 분석

* 관리자에 상점에서 별도로 사용하고자 하는 메뉴를 추가하고자 함.
* 해당 메뉴들은 고도몰에서 제공하지 않는 메뉴로, 상점에서 상점 관리에 필요한 별도의 기능을 구현하기 위한 메뉴를 추가하는 것임.

## 📝 개선안 정리

* 관리자 메뉴에 다음과 같은 메뉴 추가
  * 1차 메뉴 : 환경저장
  * 2차 메뉴 : 기본설정 > 메뉴 정책
  * 3차 메뉴 : 기본설정 > 메뉴 정책 > 메뉴 관리&#x20;

## 🛠️ 커스터마이징 진행

{% hint style="info" %}
관리자 메뉴는 `es_adminMenu` 테이블에서 관리합니다.
{% endhint %}

### 📌 관리자 1차 메뉴 추가 <a href="#esadminmenu-database-table" id="esadminmenu-database-table"></a>

<figure><img src="https://3829245599-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDr6HwDXRgyoJINAE95Gb%2Fuploads%2Fj3IB8jrFQoJD59GeST2q%2Fimage.png?alt=media&#x26;token=214e3245-4e46-4068-99e0-dd0593d9d40a" alt=""><figcaption><p>초기 1차 메뉴</p></figcaption></figure>

adminMenuSort(관리자 메뉴 순서), adminMenuNo(관리자 메뉴 고유 번호) 값을 확인합니다.

{% hint style="info" %}
adminMenuSort, adminMenuNo는 각각 고유한 값을 가져야 합니다.
{% endhint %}

아래 SELECT 쿼리를 실행하여 마지막 관리자 메뉴 순서 값을 확인합니다.

```sql
SELECT max(adminMenuSort) 
FROM `es_adminMenu` 
WHERE adminMenuDepth = 1 
    AND adminMenuType = 'd'; # d = 본사 메뉴, s = 공급사 메뉴
```

```sql
# 실행 결과 (예시)
100
```

다음으로 아래 SELECT 쿼리를 실행하여 마지막 관리자 메뉴 고유 번호를 확인합니다.

```sql
SELECT adminMenuNo 
FROM `es_adminMenu` 
WHERE adminMenuNo LIKE 'prefix%' 
ORDER BY adminMenuNo DESC 
LIMIT 0, 1;
```

```sql
# 실행 결과 (예시)
prefix00119
```

{% hint style="danger" %}
항상 메뉴고유번호는 제작사 prefix(접두사)를 입력해야 합니다. (회사영문 또는 고유영문)\
제작사 prefix(접두사) 에 godo 는 사용하지 않습니다.(godo 를 사용하시면 오류가 발생할 수 있습니다.)

**추가되는 메뉴고유번호에 godo prefix를 사용하는 경우 고도몰 배포 시, 초기화되거나 변경될 수 있습니다.**\
\
실행 결과값이 없을 경우 추가되는 메뉴고유번호는 prefix00001 입니다.\
(숫자는 00001부터 시작하여 1씩 증가해야 합니다.)
{% endhint %}

아래 INSERT 쿼리를 실행하여 필요한 관리자 1차 메뉴를 추가합니다.

```sql
INSERT INTO `es_adminMenu` (adminMenuNo, adminMenuType, adminMenuProductCode, adminMenuPlusCode,
                            adminMenuCode, adminMenuDepth, adminMenuParentNo, adminMenuSort, adminMenuName,
                            adminMenuUrl, adminMenuDisplayType, adminMenuDisplayNo, adminMenuSettingType,
                            adminMenuEcKind, regDt)
VALUES ('prefix00120', 'd', 'godomall', null,
        'setting', '1', 'setting', '101', '환경저장',
        'setting.php', 'y', 'godo00000, 'd', 'p', now());
```

관리자페이지에서 변경된 1차 메뉴를 확인합니다.

### 📌 관리자 2차 메뉴 추가 <a href="#id-2-2" id="id-2-2"></a>

아래 SELECT 쿼리를 실행하여 추가하고자 하는 2차 메뉴의 1차 메뉴 고유번호를 확인합니다.

```sql
SELECT adminMenuNo 
FROM `es_adminMenu` 
WHERE adminMenuDepth = 1 
    AND adminMenuType = 'd' 
    AND adminMenuName = '기본설정';
```

```sql
# 실행 결과 (예시)
godo00001
```

1차 메뉴인 (기본설정)의 메뉴에서 2차 메뉴의 최대 정렬 번호를 확인합니다.

```sql
SELECT max(adminMenuSort) 
FROM `es_adminMenu` 
WHERE adminMenuDepth = 2 
    AND adminMenuType = 'd' 
    AND adminMenuParentNo = 'godo00001';
```

```sql
# 실행 결과 (예시)
100
```

다음으로 아래 SELECT 쿼리를 실행하여 마지막 관리자 메뉴 고유 번호를 확인합니다.

```sql
SELECT adminMenuNo 
FROM `es_adminMenu` 
WHERE adminMenuNo LIKE 'prefix%' 
ORDER BY adminMenuNo DESC 
LIMIT 0, 1;
```

```
prefix00120
```

{% hint style="danger" %}
항상 메뉴고유번호는 제작사 prefix(접두사)를 입력해야 합니다. (회사영문 또는 고유영문) \
제작사 prefix(접두사) 에 godo 는 사용하지 않습니다. (godo 를 사용하시면 오류가 발생할 수 있습니다.)

**추가되는 메뉴고유번호에 godo prefix를 사용하는 경우 고도몰 배포 시, 초기화되거나 변경될 수 있습니다.**

\
실행 결과값이 없을 경우 추가되는 메뉴고유번호는 prefix00001 입니다. \
(숫자는 00001부터 시작하여 1씩 증가해야 합니다.)
{% endhint %}

아래 INSERT 쿼리를 실행하여 필요한 관리자 2차 메뉴를 추가합니다.

```sql
INSERT INTO `es_adminMenu` (adminMenuNo, adminMenuType, adminMenuProductCode, adminMenuPlusCode,
                            adminMenuCode, adminMenuDepth, adminMenuParentNo, adminMenuSort, adminMenuName,
                            adminMenuUrl, adminMenuDisplayType, adminMenuDisplayNo, adminMenuSettingType,
                            adminMenuEcKind, regDt)
VALUES ('prefix00121', 'd', 'godomall', null,
        'menu', '2', 'godo00001', '101', '메뉴 정책',
        null, 'y', 'godo00000', 'd', 'p', now());
```

{% hint style="warning" %}
2차 메뉴는 1개 이상의 3차 메뉴가 등록되어야 노출됩니다.
{% endhint %}

### 📌 관리자 3차 메뉴 추가 <a href="#id-2-2" id="id-2-2"></a>

아래 SELECT 쿼리를 실행하여 추가하고자 하는 3차 메뉴의 2차 메뉴 고유번호를 확인합니다.

* 위 본사 관리자의 (메뉴 관리)이라는 3차 메뉴를 추가하려면 `DataBase > es_adminMenu` 접속하신 다음 아래 Query 를 실행합니다.
* 2차 메뉴인 (메뉴 정책)의 메뉴 고유번호를 확인합니다.

```sql
SELECT adminMenuNo 
FROM `es_adminMenu` 
WHERE adminMenuDepth = 2 
    AND adminMenuType = 'd' 
    AND adminMenuName = '메뉴 정책';
```

```sql
# 실행 결과 (예시)
prefix00121
```

2차 메뉴인 (메뉴 정책)의 메뉴에서 3차 메뉴의 최대 정렬 번호를 확인합니다.

```sql
SELECT max(adminMenuSort) 
FROM `es_adminMenu` 
WHERE adminMenuDepth = 3 
    AND adminMenuType = 'd' 
    AND adminMenuParentNo = 'prefix00121';
```

```sql
# 실행 결과 (예시)
1000
```

다음으로 아래 SELECT 쿼리를 실행하여 마지막 관리자 메뉴 고유 번호를 확인합니다.

```sql
SELECT adminMenuNo 
FROM `es_adminMenu` 
WHERE adminMenuNo LIKE 'prefix%' 
ORDER BY adminMenuNo DESC 
LIMIT 0, 1;
```

```sql
# 실행 결과 (예시)
prefix00121
```

{% hint style="danger" %}
항상 메뉴고유번호는 제작사 prefix(접두사)를 입력해야 합니다. (회사영문 또는 고유영문) \
제작사 prefix(접두사) 에 godo 는 사용하지 않습니다. (godo 를 사용하시면 오류가 발생할 수 있습니다.)

**추가되는 메뉴고유번호에 godo prefix를 사용하는 경우 고도몰 배포 시, 초기화되거나 변경될 수 있습니다.**

\
실행 결과값이 없을 경우 추가되는 메뉴고유번호는 prefix00001 입니다. \
(숫자는 00001부터 시작하여 1씩 증가해야 합니다.)
{% endhint %}

아래 INSERT 쿼리를 실행하여 필요한 관리자 3차 메뉴를 추가합니다.

```sql
INSERT INTO `es_adminMenu` (adminMenuNo, adminMenuType, adminMenuProductCode, adminMenuPlusCode,
                            adminMenuCode, adminMenuDepth, adminMenuParentNo, adminMenuSort, adminMenuName,
                            adminMenuUrl, adminMenuDisplayType, adminMenuDisplayNo, adminMenuSettingType,
                            adminMenuEcKind, regDt)
VALUES ('prefix00122', 'd', 'godomall', null,
        'menu_management', '3', 'prefix00121', '1001', '메뉴 관리',
        'menu_management.php', 'y', null, 'd', 'p', now());
```

관리자 페이지 > 기본 설정 메뉴에서 추가된 2, 3차 메뉴를 확인합니다.

### 📌 관리자 메뉴별 권한 설정 <a href="#id-4" id="id-4"></a>

<figure><img src="https://3829245599-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDr6HwDXRgyoJINAE95Gb%2Fuploads%2Fm97e6YDORFKVwutFR3fu%2Fimage.png?alt=media&#x26;token=9d4bd707-fc02-4b52-b209-46460bf80f10" alt=""><figcaption><p>관리자 페이지 > 기본설정 > 관리 정책 > 운영자 권한 설정</p></figcaption></figure>

* 권한 설정은 '권한없음 / 읽기 / 읽기+쓰기' 의 3가지 조건으로 제공됩니다.
  * 권한없음 : 메뉴의 내용 확인 허용 안함
  * 읽기 : 메뉴의 내용 확인은 허용하나 정보 변경은 허용 안함
  * 읽기+쓰기 : 메뉴의 내용 확인 및 정보 변경까지 제한 없이 모두 허용함
* 쓰기 제한 추가 예시
  * 관리자 메뉴 페이지에 해당되는 컨트롤러에서 `post()` 함수를 통해 쓰기 제한 스크립트를 정의합니다.

```php
<?php
class UserPageController extends \Controller\Admin\Controller
{

    public function post()
    {
        // 관리자 메뉴 쓰기 권한에 따른 쓰기 기능 제한
        $writable = $this->getAdminMenuWritableAuth();
        if ($writable['check'] === false) {
            $returnMenuAccessAuth = [];
            $returnMenuAccessAuth[] = '$("#frmBase").validate().destroy();';
            $returnMenuAccessAuth[] = '$("#frmBase").submit(function(){ dialog_alert("__PAGE_TITLE__의 쓰기 권한이 없습니다. 권한은 대표운영자에게 문의하시기 바랍니다."); return false; });';
            $returnMenuAccessAuth = array_map(function($script) use ($writable) {return str_replace("__PAGE_TITLE__", $writable['title'], $script);}, $returnMenuAccessAuth);
            $this->setData('menuAccessAuth', implode("\n", $returnMenuAccessAuth));
        }
    }
}
```

## 🔖 결과 확인

### 📌 관리자 1차 메뉴 추가

<figure><img src="https://3829245599-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDr6HwDXRgyoJINAE95Gb%2Fuploads%2FOlg560xqP5A2DLuIGXYW%2Fimage.png?alt=media&#x26;token=bb8f3d82-c447-4de7-9eac-b8df95db8e1b" alt=""><figcaption><p>변경 후 1차 메뉴</p></figcaption></figure>

### 📌 관리자 2, 3차 메뉴 추가

<figure><img src="https://3829245599-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDr6HwDXRgyoJINAE95Gb%2Fuploads%2FpQFTP3DACqVHphv0I1fw%2Fimage.png?alt=media&#x26;token=177d6de2-09ad-4d74-8117-f6ee3d7817ef" alt=""><figcaption></figcaption></figure>
