Files
egbim_homepage/egbim/bbs/descope_qa_list.php
T
2026-07-23 16:15:57 +09:00

155 lines
4.7 KiB
PHP

<?php
// descope_qa_list.php
if (!defined('_GNUBOARD_')) define('_GNUBOARD_', true);
if (!defined('G5_URL')) define('G5_URL', '/egbim');
if (!defined('G5_BBS_URL')) define('G5_BBS_URL', '/egbim/bbs');
if (!defined('G5_IMG_URL')) define('G5_IMG_URL', '/egbim/img');
// ini_set('display_errors',1);
// error_reporting(E_ALL);
// if (!defined('_GNUBOARD_')) {
// define('_GNUBOARD_', true);
// include_once $_SERVER['DOCUMENT_ROOT'].'/egbim/_common.php';
// }
require_once __DIR__ . '/../skin/member/basic/descope_session.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/egbim/bbs/admin_guard.php';
// session_start();
// //로그인 체크
// if (empty($_SESSION['user']['userId'])) {
// header('Location: https://eg-bim.co.kr/egbim/index.php');
// exit;
// }
// DB 연결
$pdo = new PDO(
"mysql:host=db;dbname=egbim;charset=utf8mb4",
'egbim','baron3840!!',
[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]
);
$page = max(1, (int)($_GET['page'] ?? 1));
$pageSize = 10;
$offset = ($page - 1) * $pageSize;
// ===== 필터/검색 파라미터 =====
$writer = $_GET['writer'] ?? 'all'; // all | me
$search = trim($_GET['q'] ?? '');
$status = $_GET['status'] ?? 'all';
$allowedStatus = ['new','review','deep','patch','done'];
// 복수 구분(cat[]) — general | improvement | error | notice | admin
$catsParam = $_GET['cat'] ?? [];
if (!is_array($catsParam)) $catsParam = [$catsParam];
$allowedCats = ['general','improvement','error','notice','admin'];
$cats = array_values(array_intersect($catsParam, $allowedCats)); // 유효값만
$me = $_SESSION['user']['loginIds'][0] ?? '';
$admin = function_exists('is_qna_admin') ? is_qna_admin() : false;
// ===== WHERE 절 =====
$where = ['1'];
$params = [];
// 작성자(내 글만)
if ($writer === 'me' && $me) {
$where[] = 'login_id = ?';
$params[] = $me;
}
// 구분(cat[]) 필터
if (!empty($cats)) {
$ph = implode(',', array_fill(0, count($cats), '?'));
$where[] = "category IN ($ph)";
foreach ($cats as $c) $params[] = $c;
}
// 상태(status) 필터 — 관리자만 적용
if ($admin && $status !== 'all' && in_array($status, $allowedStatus, true)) {
$where[] = 'status = ?';
$params[] = $status;
}
// 검색(제목+내용+작성자)
if ($search !== '') {
$where[] = '(title LIKE ? OR content LIKE ? OR user_name LIKE ? OR login_id LIKE ?)';
$params[] = "%{$search}%";
$params[] = "%{$search}%";
$params[] = "%{$search}%";
$params[] = "%{$search}%";
}
// // 비밀글 가드: 관리자는 전체, 일반은 공개 OR 내 글만
// if (!$admin) {
// $where[] = '(is_secret = 0 OR login_id = ?)';
// $params[] = $me;
// }
// ✅ 비밀글 가드
if (!$admin) {
if ($me) {
$where[] = '(is_secret = 0 OR login_id = ?)';
$params[] = $me;
} else {
$where[] = 'is_secret = 0';
}
}
// 전체 건수
$countSql = "SELECT COUNT(*) FROM qa_posts WHERE ".implode(' AND ', $where);
$countStmt = $pdo->prepare($countSql);
$countStmt->execute($params);
$totalCount = (int)$countStmt->fetchColumn();
// 데이터 조회 (공지 상단 고정)
$sql = "
SELECT
p.post_id, p.category, p.company, p.family_company, p.department,
p.login_id, p.user_name, p.title, p.created_at, p.status, p.is_secret, p.is_read_admin,
-- 댓글 개수
(SELECT COUNT(*) FROM qa_comments c WHERE c.post_id = p.post_id) AS comment_count,
-- 첨부파일 개수
(SELECT COUNT(*) FROM qa_attachments a WHERE a.post_id = p.post_id) AS file_count
FROM qa_posts p
WHERE ".implode(' AND ', $where)."
ORDER BY (p.category='notice') DESC, p.created_at DESC
LIMIT {$offset}, {$pageSize}";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$posts = $stmt->fetchAll();
foreach ($posts as &$row) {
// 회사명 표시 조립
$displayCompany = $row['family_company'] ?: $row['company'];
// if (!empty($row['department'])) {
// $displayCompany .= ' / ' . $row['department'];
// }
$row['display_company'] = $displayCompany;
// 작성자 이름
$row['display_name'] = get_admin_display_name(
$row['login_id'],
$row['user_name'] ?: $row['login_id']
);
// 상태값 가공: 공지사항이면 빈칸
if ($row['category'] === 'notice') {
$row['status'] = '';
}
// ✅ NEW 표시 여부 (24시간 기준)
$createdTime = strtotime($row['created_at']);
$row['is_new'] = ($createdTime >= strtotime('-24 hours'));
}
unset($row);
$totalPages = (int)ceil($totalCount / $pageSize);
// $me = $_SESSION['user']['loginIds'][0] ?? '';
include __DIR__ . '/../skin/qa/basic/descope_qa_list.skin.php';