Initial commit: 교육 프로젝트 배포
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
<?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(),
|
||||
]);
|
||||
}
|
||||
Reference in New Issue
Block a user