
기획
전체공지 스킨 (dx-global-notice) 사용설명서
DXCMS 코어의 "전체공지" 표시 방식을 스킨 단위로 자유롭게 디자인할 수 있는 플러그인입니다. 설치 후 별도 DB 작업 없이 바로 사용할 수 있습니다.
1. 이 플러그인이 하는 일
- 모든 페이지(게시판 목록뿐 아니라 홈/상세 등 전체 페이지) 최상단에 전체공지를 표시합니다.
- 표시 디자인을 "스킨" 단위로 자유롭게 바꿀 수 있습니다.
- 활성화하면: 이 플러그인이 전체공지 표시를 전담하고, 기존(코어)의 게시판 목록 상단 전체공지 출력은 자동으로 숨겨져 중복 표시되지 않습니다.
- 비활성화하면: 아무 일도 하지 않고, 코어의 기존 전체공지 표시 방식(게시판 목록 상단)이 그대로 동작합니다.
전체공지 내용(제목, 링크, 색상, 게시 기간 등) 자체는 기존과 동일하게 관리자 > 전체 공지 화면에서 등록/수정합니다. 이 플러그인은 "디자인(표시 방식)"만 바꿉니다.
2. 설치
- 압축 파일을 DXCMS 설치 폴더에 그대로 풀어 덮어씁니다. (기존 파일과 겹치지 않으므로 안전합니다)
plugins/dx-global-notice/ ← 플러그인 본체
admin/global_notice_skin/ ← 관리자 화면 연결 파일
- 관리자 로그인 후 관리자 > 플러그인 관리 메뉴로 이동합니다.
- 목록에서 "전체공지 스킨" 플러그인을 찾아 활성화 토글을 켭니다.
활성화하는 즉시, 사이드바 메뉴의 "전체 공지" 항목 바로 아래에 "전체공지 스킨" 메뉴가 자동으로 추가됩니다.
3. 스킨 선택하기
- 관리자 > 전체공지 스킨 메뉴로 이동합니다.
- 화면 상단에 현재 플러그인 활성화 상태가 표시됩니다.
- 🟢 활성화: 선택한 스킨이 실제 사이트에 바로 적용됩니다.
- 🟡 비활성화: 스킨을 선택해도 적용되지 않습니다. (관리자 > 플러그인 관리에서 먼저 활성화하세요)
- 카드 형태로 표시되는 스킨 목록에서 원하는 스킨을 **클릭(라디오 선택)**하면 자동으로 저장됩니다. 별도의 저장 버튼은 없습니다.
- 화면 아래쪽 "현재 스킨 미리보기" 영역에서 실제 표시될 모습을 바로 확인할 수 있습니다.
- 등록된 전체공지가 있으면 실제 내용으로,
- 없으면 샘플 문구로 미리보기됩니다.
- "닫기(×) 후 재표시 주기" 항목에서, 방문자가 닫기 버튼을 누른 뒤 다시 표시되기까지의 시간(시간 단위)을 설정할 수 있습니다.
- 기본값: 3시간
- 0으로 설정하면, 같은 공지 구성에 대해서는 닫은 뒤 다시 표시되지 않습니다(영구 숨김).
- 값을 입력한 뒤 저장 버튼을 눌러야 적용됩니다(스킨 선택과 별도 저장).
기본 제공 스킨:
| 스킨 ID | 이름 | 설명 |
|---|---|---|
basic |
베이직 | 보라색 그라디언트 배경의 기본형 바. 닫기(×) 버튼 클릭 시 이번 방문(브라우저 탭) 동안 숨겨집니다. |
4. 사이트에서 확인하기
- 활성화 후 사이트 어느 페이지든 새로고침하면, 페이지 맨 위에(헤더보다 위) 전체공지 바가 즉시 표시됩니다. 페이지가 다 그려진 후 따로 불러와 깜빡이거나 화면이 밀리는 현상 없이, 처음부터 포함되어 나타납니다.
- 관리자 > 전체 공지에 등록된 공지가 없으면 표시 영역 자체가 나타나지 않습니다(공간을 차지하지 않음).
- 실시간 알림(소켓) 플러그인이 함께 설치되어 있다면, 관리자가 공지를 추가/수정/삭제하는 즉시 접속자 화면에도 자동으로 반영됩니다.
- 사용자가 닫기(×) 버튼을 누르면, 관리자 > 전체공지 스킨 화면에서 설정한 시간(기본 3시간)이 지나면 같은 탭/브라우저에서도 다시 표시됩니다. 그 전에는 새로고침해도 숨김 상태가 유지됩니다.
- 닫은 뒤 관리자가 공지를 추가/수정/삭제하면, 재표시 시간이 지나지 않았어도 즉시 다시 표시됩니다(내용이 바뀌었기 때문).
5. 나만의 스킨 만들기
디자인을 직접 만들고 싶다면 새 폴더를 추가하는 것만으로 가능합니다. 코드 수정이나 재설치가 필요 없습니다.
5-1. 폴더 만들기
plugins/dx-global-notice/skins/내스킨이름/
- 폴더명이 곧 스킨 ID가 되어, 관리자 > 전체공지 스킨 화면의 선택 목록에 자동으로 나타납니다.
- 폴더명은 영문/숫자/하이픈(-)/언더스코어(_)만 사용하세요.
5-2. 필요한 파일
| 파일 | 필수 여부 | 설명 |
|---|---|---|
template.php |
필수 | 공지 목록 HTML을 출력하는 PHP 템플릿 |
style.css |
선택 | 스킨 디자인 CSS |
skin.json |
선택 | 선택 목록에 표시될 이름/설명 |
5-3. skin.json 예시
json
{
"name": "심플 화이트",
"description": "흰 배경에 빨간 글씨로 강조하는 미니멀 스킨입니다."
}
작성하지 않으면 폴더명이 그대로 이름으로 표시됩니다.
5-4. template.php 예시
$notices 라는 배열이 자동으로 전달됩니다. 각 항목은 아래 필드를 가집니다.
| 필드 | 설명 |
|---|---|
title |
공지 제목 (텍스트) |
title_color |
제목 색상 (#ff0000 형식, 없을 수 있음) |
link_url |
클릭 시 이동할 주소 (없을 수 있음) |
link_target |
_self 또는 _blank |
가장 간단한 예시:
php
<?php if (!defined('DX_CMS')) exit('Direct access not allowed.'); ?>
<div class="dxgn-inner">
<?php foreach ($notices as $n):
$title = htmlspecialchars($n['title'], ENT_QUOTES, 'UTF-8');
$link = trim($n['link_url']);
?>
<div class="dxgn-item">
<?php if ($link): ?>
<a href="<?php echo htmlspecialchars($link, ENT_QUOTES, 'UTF-8'); ?>"><?php echo $title; ?></a>
<?php else: ?>
<span><?php echo $title; ?></span>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
⚠️ 첫 줄의
if (!defined('DX_CMS')) exit(...)는 반드시 포함하세요. 보안을 위한 직접 접근 차단 코드입니다.
5-5. style.css 작성 규칙
다른 스킨과 스타일이 섞이지 않도록, 모든 선택자는 .dxgn-skin-내스킨이름 으로 시작해야 합니다.
.dxgn-skin-내스킨이름 .dxgn-inner {
background: #ffffff;
color: #dc2626;
padding: 10px 20px;
font-weight: 700;
text-align: center;
}
5-6. 적용하기
폴더와 파일을 모두 만든 뒤 관리자 > 전체공지 스킨 화면을 새로고침하면 새 스킨이 카드 목록에 나타납니다. 클릭하면 즉시 적용 및 미리보기됩니다.
6. 자주 묻는 질문 (FAQ)
Q. 활성화했는데 전체공지가 안 보여요. A. 관리자 > 전체 공지에 활성 상태(상태=활성)이고 게시 기간이 현재 시점을 포함하는 공지가 1건 이상 등록되어 있는지 확인하세요. 등록된 공지가 없으면 정상적으로 아무것도 표시되지 않습니다.
Q. 게시판 목록 상단에 전체공지가 두 번 표시돼요. A. 플러그인이 비활성화 상태이면서 과거 버전의 캐시가 남아있을 수 있습니다. 관리자 > 플러그인 관리에서 활성화 상태를 다시 확인하고, 사이트 캐시를 한 번 비워보세요(설정 저장 시 자동으로 비워집니다).
Q. 비활성화하면 어떻게 되나요? A. 이 플러그인의 모든 동작이 즉시 중단되고, 코어의 원래 전체공지 표시 방식(게시판 목록 상단)으로 자동 복귀합니다. 데이터(공지 내용)는 그대로 유지됩니다.
Q. 닫기 버튼을 누르면 영구히 안 보이나요? A. 아니요. 관리자 > 전체공지 스킨 화면에서 설정한 "재표시 주기"(기본 3시간)가 지나면 같은 브라우저에서도 다시 표시됩니다. 0으로 설정한 경우에만 같은 공지 구성에 대해 영구히 숨겨집니다. 어떤 설정이든, 공지 내용이 추가/수정/삭제되면 즉시 다시 표시됩니다.
Q. 만든 스킨이 목록에 안 나타나요. A. template.php 파일이 폴더 안에 정확히 존재하는지 확인하세요. 이 파일이 없으면 스킨으로 인식되지 않습니다.