Files
edu/ajax/get_review_list_for_mypage.php
T

161 lines
4.4 KiB
PHP

<?php
//[마이페이지][한줄소감] 데이터 동적변환
require_once __DIR__ . '/../bbs/db_conn.php';
header('Content-Type: application/json; charset=utf-8');
// TODO: 실제 로그인 세션 연동 후 교체
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
$memberId = $_SESSION['member_id'] ?? '';
$sysCompCode = $_SESSION['sys_comp_code'] ?? '';
//$memberId = 'U001';
//$sysCompCode = 'COMP01';
/**
* JSON 응답 출력 함수
*/
function response_json(array $data): void
{
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
}
/**
* HTML escape 함수
*/
function h(?string $str): string
{
return htmlspecialchars((string)$str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
/**
* 카테고리 태그 클래스 반환
*/
function review_category_tag_class(string $categoryCode): string
{
$map = [
'CA10001' => 'myclass',
'CA10002' => 'onboarding',
'CA10003' => 'legal',
'CA10004' => 'leader',
'CA10005' => 'insight',
'CA10006' => 'biz',
];
return $map[$categoryCode] ?? 'etc';
}
try {
$pdo = db_conn();
$pdo->exec("SET NAMES 'utf8mb4'");
// ★ 선택년도 파라미터 수집
$selectedYear = trim((string)($_GET['selected_year'] ?? date('Y')));
if ($selectedYear === '' || !preg_match('/^\d{4}$/', $selectedYear)) {
$selectedYear = date('Y');
}
// ★ 한줄소감 조회
// - 선택년도 기준
// - comment 값이 있는 이력만
// - 마이클래스(CA10001)만
// - 같은 content_id는 최신 시청이력 1건만
$sql = "
SELECT
lh.content_id,
lh.member_id,
lh.sys_comp_code,
lh.watch_tm,
lh.content_tm,
lh.last_viewed_at,
lh.completed_at,
lh.comment,
c.category_code,
c.title,
c.content_url,
c.thumbnail_url
FROM edu_learning_histories lh
INNER JOIN (
SELECT
content_id,
MAX(last_viewed_at) AS max_last_viewed_at
FROM edu_learning_histories
WHERE member_id = :sub_member_id
AND sys_comp_code = :sub_sys_comp_code
AND YEAR(last_viewed_at) = :sub_selected_year
AND comment IS NOT NULL
AND TRIM(comment) <> ''
GROUP BY content_id
) latest
ON latest.content_id = lh.content_id
AND latest.max_last_viewed_at = lh.last_viewed_at
INNER JOIN edu_contents c
ON c.content_id = lh.content_id
WHERE lh.member_id = :main_member_id
AND lh.sys_comp_code = :main_sys_comp_code
AND c.category_code = 'CA10001'
AND lh.comment IS NOT NULL
AND TRIM(lh.comment) <> ''
ORDER BY lh.last_viewed_at DESC
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':sub_member_id' => $memberId,
':sub_sys_comp_code' => $sysCompCode,
':sub_selected_year' => (int)$selectedYear,
':main_member_id' => $memberId,
':main_sys_comp_code' => $sysCompCode,
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$totalCount = count($rows);
ob_start();
if (!empty($rows)) {
foreach ($rows as $row) {
$categoryCode = (string)($row['category_code'] ?? '');
$tagClass = review_category_tag_class($categoryCode);
// ★ 실제 한줄소감은 edu_learning_histories.comment 사용
$reviewText = trim((string)($row['comment'] ?? ''));
?>
<li class="review-item" data-content-id="<?= h($row['content_id'] ?? '') ?>">
<div class="review-head">
<span class="category-tag <?= h($tagClass) ?>">마이클래스</span>
<p class="review-text"><?= h($row['title'] ?? '') ?></p>
</div>
<div class="review-comment">
<span class="review-comment-text">
<?= h($reviewText) ?>
</span>
</div>
</li>
<?php
}//foreach
} else {
?>
<li class="review-empty">한줄소감이 없습니다.</li>
<?php
}
$html = ob_get_clean();
response_json([
'success' => true,
'selected_year' => $selectedYear,
'total_count' => $totalCount,
'html' => $html,
]);
} catch (Throwable $e) {
response_json([
'success' => false,
'message' => '한줄소감 리스트를 불러오지 못했습니다.',
'error' => $e->getMessage(),
]);
}