Commit e0d5ecfb authored by Mahmoud Aglan's avatar Mahmoud Aglan

cool

parent d0024d34
...@@ -613,12 +613,15 @@ class TutorialController extends Controller ...@@ -613,12 +613,15 @@ class TutorialController extends Controller
$tutorials = []; $tutorials = [];
foreach ($section['tutorials'] as $slug => $tutorial) { foreach ($section['tutorials'] as $slug => $tutorial) {
$viewFile = $section['viewDir'] . '/' . str_replace('-', '_', $slug) . '.php'; $viewFile = $section['viewDir'] . '/' . str_replace('-', '_', $slug) . '.php';
$content = ''; $extracted = ['steps' => [], 'images' => []];
if (file_exists($viewFile)) { if (file_exists($viewFile)) {
$content = file_get_contents($viewFile); $raw = file_get_contents($viewFile);
$content = $this->extractTutorialContent($content); $extracted = $this->extractTutorialSteps($raw);
} }
$tutorials[$slug] = array_merge($tutorial, ['htmlContent' => $content]); $tutorials[$slug] = array_merge($tutorial, [
'steps' => $extracted['steps'],
'images' => $extracted['images'],
]);
} }
$book['sections'][$key] = [ $book['sections'][$key] = [
'title' => $section['title'], 'title' => $section['title'],
...@@ -659,14 +662,16 @@ class TutorialController extends Controller ...@@ -659,14 +662,16 @@ class TutorialController extends Controller
return $book; return $book;
} }
private function extractTutorialContent(string $raw): string private function extractTutorialSteps(string $raw): array
{ {
$steps = [];
$start = strpos($raw, '<div class="tut-page">'); $start = strpos($raw, '<div class="tut-page">');
if ($start === false) { if ($start === false) {
$start = strpos($raw, '<div class="tut-header">'); $start = strpos($raw, '<div class="tut-header">');
} }
if ($start === false) { if ($start === false) {
return ''; return $steps;
} }
$content = substr($raw, $start); $content = substr($raw, $start);
...@@ -676,11 +681,44 @@ class TutorialController extends Controller ...@@ -676,11 +681,44 @@ class TutorialController extends Controller
$content = substr($content, 0, $navPos); $content = substr($content, 0, $navPos);
} }
$content = preg_replace('/<div class="tut-breadcrumb">.*?<\/div>/s', '', $content); preg_match_all(
$content = str_replace('loading="lazy"', '', $content); '/<div class="tut-step">(.*?)<\/div>\s*<\/div>/s',
$content,
$stepMatches
);
if (empty($stepMatches[1])) {
preg_match_all(
'/<div class="tut-step">(.+?)(?=<div class="tut-step">|<div class="tut-nav">|$)/s',
$content,
$stepMatches
);
}
foreach ($stepMatches[0] as $stepHtml) {
$title = '';
if (preg_match('/<h3 class="tut-step-title">(.*?)<\/h3>/s', $stepHtml, $m)) {
$title = strip_tags($m[1]);
}
$body = '';
if (preg_match('/<div class="tut-step-body">(.*)/s', $stepHtml, $m)) {
$body = $m[1];
$body = preg_replace('/<\/div>\s*$/', '', $body);
$body = preg_replace('/<i\s+data-lucide="[^"]*"[^>]*><\/i>/', '', $body);
$body = str_replace('loading="lazy"', '', $body);
}
$content = preg_replace('/<i\s+data-lucide="[^"]*"[^>]*><\/i>/', '', $content); if ($title || $body) {
$steps[] = ['title' => $title, 'body' => $body];
}
}
$images = [];
if (preg_match_all('/<img[^>]+src="([^"]+)"[^>]*>/i', $content, $imgMatches)) {
$images = $imgMatches[1];
}
return $content; return ['steps' => $steps, 'images' => $images];
} }
} }
This diff is collapsed.
This diff is collapsed.
...@@ -13,13 +13,17 @@ MenuRegistry::register('tutorials', [ ...@@ -13,13 +13,17 @@ MenuRegistry::register('tutorials', [
'parent' => null, 'parent' => null,
'order' => 990, 'order' => 990,
'children' => [ 'children' => [
// ── البداية ──────────────────────────────────────────
['label_ar' => 'لوحة التحكم', 'label_en' => 'Dashboard', 'route' => '/tutorials/dashboard', 'permission' => 'tutorials.view', 'order' => 0],
// ── العمليات (Operations) ────────────────────────── // ── العمليات (Operations) ──────────────────────────
['label_ar' => 'شئون العضوية', 'label_en' => 'Membership', 'route' => '/tutorials/membership', 'permission' => 'tutorials.view', 'order' => 1], ['label_ar' => 'شئون العضوية', 'label_en' => 'Membership', 'route' => '/tutorials/membership', 'permission' => 'tutorials.view', 'order' => 1],
['label_ar' => 'الأنشطة الرياضية', 'label_en' => 'Sports Activity', 'route' => '/tutorials/sports-activity', 'permission' => 'tutorials.view', 'order' => 2], ['label_ar' => 'العائلة والتابعين', 'label_en' => 'Family & Dependents', 'route' => '/tutorials/family', 'permission' => 'tutorials.view', 'order' => 2],
['label_ar' => 'الحجوزات', 'label_en' => 'Reservations', 'route' => '/tutorials/reservations', 'permission' => 'tutorials.view', 'order' => 3], ['label_ar' => 'التحويلات والتنازلات', 'label_en' => 'Transfers & Waivers', 'route' => '/tutorials/transfers-waivers', 'permission' => 'tutorials.view', 'order' => 3],
['label_ar' => 'البطولات', 'label_en' => 'Tournaments', 'route' => '/tutorials/tournaments', 'permission' => 'tutorials.view', 'order' => 4], ['label_ar' => 'الأنشطة الرياضية', 'label_en' => 'Sports Activity', 'route' => '/tutorials/sports-activity', 'permission' => 'tutorials.view', 'order' => 4],
['label_ar' => 'الكارنيهات والدعوات', 'label_en' => 'Carnets & Invitations','route' => '/tutorials/carnets', 'permission' => 'tutorials.view', 'order' => 5], ['label_ar' => 'الحجوزات', 'label_en' => 'Reservations', 'route' => '/tutorials/reservations', 'permission' => 'tutorials.view', 'order' => 5],
['label_ar' => 'أولياء الأمور', 'label_en' => 'Parents', 'route' => '/tutorials/parents', 'permission' => 'tutorials.view', 'order' => 6], ['label_ar' => 'البطولات', 'label_en' => 'Tournaments', 'route' => '/tutorials/tournaments', 'permission' => 'tutorials.view', 'order' => 6],
['label_ar' => 'الكارنيهات والدعوات', 'label_en' => 'Carnets & Invitations','route' => '/tutorials/carnets', 'permission' => 'tutorials.view', 'order' => 7],
['label_ar' => 'أولياء الأمور', 'label_en' => 'Parents', 'route' => '/tutorials/parents', 'permission' => 'tutorials.view', 'order' => 8],
// ── المالية (Finance) ────────────────────────────── // ── المالية (Finance) ──────────────────────────────
['label_ar' => 'خزنة العضويات', 'label_en' => 'Cashier', 'route' => '/tutorials/cashier', 'permission' => 'tutorials.view', 'order' => 10], ['label_ar' => 'خزنة العضويات', 'label_en' => 'Cashier', 'route' => '/tutorials/cashier', 'permission' => 'tutorials.view', 'order' => 10],
['label_ar' => 'الخزنة الفرعية', 'label_en' => 'Treasury', 'route' => '/tutorials/treasury', 'permission' => 'tutorials.view', 'order' => 11], ['label_ar' => 'الخزنة الفرعية', 'label_en' => 'Treasury', 'route' => '/tutorials/treasury', 'permission' => 'tutorials.view', 'order' => 11],
...@@ -32,6 +36,9 @@ MenuRegistry::register('tutorials', [ ...@@ -32,6 +36,9 @@ MenuRegistry::register('tutorials', [
// ── الشئون الإدارية (Administration) ─────────────── // ── الشئون الإدارية (Administration) ───────────────
['label_ar' => 'الموارد البشرية', 'label_en' => 'HR', 'route' => '/tutorials/hr', 'permission' => 'tutorials.view', 'order' => 30], ['label_ar' => 'الموارد البشرية', 'label_en' => 'HR', 'route' => '/tutorials/hr', 'permission' => 'tutorials.view', 'order' => 30],
['label_ar' => 'اللجنة الطبية', 'label_en' => 'Medical Board', 'route' => '/tutorials/medical-board', 'permission' => 'tutorials.view', 'order' => 31], ['label_ar' => 'اللجنة الطبية', 'label_en' => 'Medical Board', 'route' => '/tutorials/medical-board', 'permission' => 'tutorials.view', 'order' => 31],
// ── البوابات (Portals) ─────────────────────────────
['label_ar' => 'بوابة المدربين', 'label_en' => 'Trainer Portal', 'route' => '/tutorials/trainer-portal', 'permission' => 'tutorials.view', 'order' => 35],
['label_ar' => 'بوابة أولياء الأمور', 'label_en' => 'Parent Portal', 'route' => '/tutorials/parent-portal', 'permission' => 'tutorials.view', 'order' => 36],
// ── التقارير والنظام (Reports & System) ──────────── // ── التقارير والنظام (Reports & System) ────────────
['label_ar' => 'التقارير', 'label_en' => 'Reports', 'route' => '/tutorials/reports', 'permission' => 'tutorials.view', 'order' => 40], ['label_ar' => 'التقارير', 'label_en' => 'Reports', 'route' => '/tutorials/reports', 'permission' => 'tutorials.view', 'order' => 40],
['label_ar' => 'المستخدمون والصلاحيات', 'label_en' => 'Users & Permissions', 'route' => '/tutorials/roles', 'permission' => 'tutorials.view', 'order' => 41], ['label_ar' => 'المستخدمون والصلاحيات', 'label_en' => 'Users & Permissions', 'route' => '/tutorials/roles', 'permission' => 'tutorials.view', 'order' => 41],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment