diff --git a/backend/app/Controllers/CurriculumController.php b/backend/app/Controllers/CurriculumController.php index fe1c3ec..5030e59 100644 --- a/backend/app/Controllers/CurriculumController.php +++ b/backend/app/Controllers/CurriculumController.php @@ -239,11 +239,24 @@ class CurriculumController } } - foreach ($tree as &$grade) foreach (($grade['subjects'] ?? []) as &$subject) foreach (($subject['semesters'] ?? []) as &$semester) foreach (($semester['units'] ?? []) as &$unit) foreach (($unit['lessons'] ?? []) as &$lesson) { - $path = (string)($lesson['file'] ?? ''); - if (isset($byPath[$path])) $lesson = array_merge($lesson, $byPath[$path]); + foreach ($tree as $gKey => $grade) { + if (!isset($tree[$gKey]['subjects']) || !is_array($tree[$gKey]['subjects'])) continue; + foreach ($tree[$gKey]['subjects'] as $sKey => $subject) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'] as $semKey => $semester) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'] as $uKey => $unit) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'] as $lKey => $lesson) { + $path = (string)($lesson['file'] ?? ''); + if (isset($byPath[$path])) { + $tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'][$lKey] = array_merge($lesson, $byPath[$path]); + } + } + } + } + } } - unset($grade, $subject, $semester, $unit, $lesson); // The manifest describes intake files only. Student-visible resources // are rebuilt from approved, rights-cleared assets in a published @@ -274,22 +287,24 @@ class CurriculumController 'type' => $group === 'textbooks' ? 'textbook' : 'worksheet', ]; } - foreach ($tree as &$grade) foreach (($grade['subjects'] ?? []) as $subjectKey => &$subject) { - $subjectResources = $resourcesBySubject[(string)$subjectKey] ?? ['textbooks' => [], 'worksheets' => []]; - foreach (['textbooks', 'worksheets'] as $group) { - foreach ($subjectResources[$group] as $index => &$resource) { - $resource['title'] = $group === 'textbooks' - ? 'كتاب منشور ' . ($index + 1) - : 'ورقة عمل منشورة ' . ($index + 1); + foreach ($tree as $gKey => $grade) { + if (!isset($tree[$gKey]['subjects']) || !is_array($tree[$gKey]['subjects'])) continue; + foreach ($tree[$gKey]['subjects'] as $sKey => $subject) { + $subjectResources = $resourcesBySubject[(string)$sKey] ?? ['textbooks' => [], 'worksheets' => []]; + foreach (['textbooks', 'worksheets'] as $group) { + foreach ($subjectResources[$group] as $index => &$resource) { + $resource['title'] = $group === 'textbooks' + ? 'كتاب منشور ' . ($index + 1) + : 'ورقة عمل منشورة ' . ($index + 1); + } + unset($resource); } - unset($resource); + $tree[$gKey]['subjects'][$sKey]['resources'] = [ + 'textbooks' => ['items' => $subjectResources['textbooks']], + 'worksheets' => ['items' => $subjectResources['worksheets']], + ]; } - $subject['resources'] = [ - 'textbooks' => ['items' => $subjectResources['textbooks']], - 'worksheets' => ['items' => $subjectResources['worksheets']], - ]; } - unset($grade, $subject); } catch (\Throwable $e) { error_log('Published curriculum tree enrichment unavailable: '.$e->getMessage()); } $response->json(['status'=>'success','data'=>$tree]); } diff --git a/backend/scripts/diagnose_tree.php b/backend/scripts/diagnose_tree.php index cb5239d..ccc1020 100644 --- a/backend/scripts/diagnose_tree.php +++ b/backend/scripts/diagnose_tree.php @@ -55,14 +55,18 @@ try { echo " Mapped " . count($byPath) . " paths in \$byPath lookup table.\n"; $matchCount = 0; - foreach ($tree as &$grade) { - foreach (($grade['subjects'] ?? []) as &$subject) { - foreach (($subject['semesters'] ?? []) as &$semester) { - foreach (($semester['units'] ?? []) as &$unit) { - foreach (($unit['lessons'] ?? []) as &$lesson) { + foreach ($tree as $gKey => $grade) { + if (!isset($tree[$gKey]['subjects']) || !is_array($tree[$gKey]['subjects'])) continue; + foreach ($tree[$gKey]['subjects'] as $sKey => $subject) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'] as $semKey => $semester) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'] as $uKey => $unit) { + if (!isset($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons']) || !is_array($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'])) continue; + foreach ($tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'] as $lKey => $lesson) { $path = (string)($lesson['file'] ?? ''); if (isset($byPath[$path])) { - $lesson = array_merge($lesson, $byPath[$path]); + $tree[$gKey]['subjects'][$sKey]['semesters'][$semKey]['units'][$uKey]['lessons'][$lKey] = array_merge($lesson, $byPath[$path]); $matchCount++; } } @@ -70,7 +74,6 @@ try { } } } - unset($grade, $subject, $semester, $unit, $lesson); echo " Enriched matches in manifest.json tree: {$matchCount}\n";