{{-- ============================================================================ PAGE CONTENT — Arkib Elektronik Site : nres · Page slug: electronic-archive · Page ID: 35 Konsep: https://www.nres.gov.my/ms-my/Pages/default.aspx → MEDIA → Arkib Elektronik (portal: tab tahun 2025…2021 + Lain-lain; setiap item = tajuk + dokumen) Sumber data (3 skema berbeza → dinormalkan kepada satu bentuk baris): · content_media + content_media_translations → Kenyataan Media / Siaran Media / Keratan Akhbar · content_speeches → Teks Ucapan (terjemahan self-referencing: baris induk speech_main='1', anak ikut speech_parent_id) · content_article + content_article_translation → Berita Parameter URL: jenis berita | ucapan | kenyataan | keratan (kosong = halaman hab) tahun tahun dokumen (cth 2026) atau 'lain' (rekod tanpa tarikh) q carian tajuk (pilihan) Nota: · SEMUA logik + markup + CSS ada dalam fail ini — tiada komponen, tiada partial. · Tiada paparan butiran: tajuk & butang Dokumen terus buka/muat turun fail (macam portal). · Warna guna CSS variable tema (--teal/--green/--fade/--line/--ink) → sokong dark mode. · Jadual content_clippings (tinggalan) TIDAK digunakan — Keratan Akhbar = content_media. ============================================================================ --}} @php /* -------------------------------------------------------------------- | 1. Parameter & konteks -------------------------------------------------------------------- */ $arkBase = url()->current(); $arkQuery = request()->query(); $arkLang = ($lang ?? session('locale', 'ms')) === 'en' ? 'en' : 'ms'; $arkJenisDefs = [ 'berita' => [ 'ms' => 'Berita', 'en' => 'News', 'descr_ms' => 'Arkib berita dan pengumuman kementerian.', 'descr_en' => 'Archive of ministry news and announcements.', ], 'ucapan' => [ 'ms' => 'Teks Ucapan', 'en' => 'Speeches', 'descr_ms' => 'Arkib teks ucapan, perasmian dan majlis.', 'descr_en' => 'Archive of speeches, openings and official events.', ], 'kenyataan' => [ 'ms' => 'Kenyataan Media', 'en' => 'Media Statements', 'descr_ms' => 'Arkib kenyataan media dan siaran media rasmi.', 'descr_en' => 'Archive of official media statements and media releases.', ], 'keratan' => [ 'ms' => 'Keratan Akhbar', 'en' => 'Newspaper Clippings', 'descr_ms' => 'Arkib keratan akhbar daripada media massa.', 'descr_en' => 'Archive of newspaper clippings from the mass media.', ], ]; $arkJenisKeys = array_keys($arkJenisDefs); $arkJenis = (string) ($arkQuery['jenis'] ?? ''); $arkJenis = in_array($arkJenis, $arkJenisKeys, true) ? $arkJenis : ''; $arkTahun = (string) ($arkQuery['tahun'] ?? ''); $arkTahun = ($arkTahun === 'lain' || preg_match('/^\d{4}$/', $arkTahun)) ? $arkTahun : ''; $arkCari = trim((string) ($arkQuery['q'] ?? '')); $arkCari = mb_substr($arkCari, 0, 60); $arkJenisLabel = fn (string $key) => $arkJenisDefs[$key][$arkLang] ?? $arkJenisDefs[$key]['ms']; // Pembina URL (kekalkan param lain; set nilai '' untuk buang) $arkUrl = function (array $params = []) use ($arkBase, $arkJenis, $arkTahun, $arkCari) { $current = ['jenis' => $arkJenis, 'tahun' => $arkTahun, 'q' => $arkCari]; $query = array_filter(array_merge($current, $params), fn ($v) => $v !== null && $v !== ''); return $query ? $arkBase.'?'.http_build_query($query) : $arkBase; }; // Fail pada disk 'public' → URL awam (sama seperti halaman lain) $arkFile = function ($path) { $path = trim((string) $path); if ($path === '') { return ''; } if (str_starts_with($path, 'http://') || str_starts_with($path, 'https://')) { return $path; } if (str_starts_with($path, 'dynaweb4/')) { return asset($path); } return asset('storage/'.ltrim($path, '/')); }; $arkDate = function ($value) use ($arkLang) { if (blank($value)) { return ''; } try { return \Carbon\Carbon::parse($value)->format('d/m/Y'); } catch (\Throwable $e) { return (string) $value; } }; $arkMonths = $arkLang === 'en' ? [1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] : [1 => 'Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember']; $arkDateLong = function ($value) use ($arkMonths) { if (blank($value)) { return ''; } try { $date = \Carbon\Carbon::parse($value); return $date->day.' '.$arkMonths[(int) $date->month].' '.$date->year; } catch (\Throwable $e) { return (string) $value; } }; $arkToday = now()->toDateString(); /* -------------------------------------------------------------------- | 2. Adapter — 3 skema → satu bentuk baris seragam | ['jenis','date','title','summary','file','img','url','source','badge'] -------------------------------------------------------------------- */ $arkItems = []; // Label sumber (ref MEDIA_SOURCE) — kod pendek untuk jadual, nama penuh dalam title $arkSourceLabel = []; foreach (DB::table('ref')->where('cat', 'MEDIA_SOURCE')->get() as $arkRef) { $arkSourceLabel[(string) $arkRef->code] = $arkLang === 'en' ? ((string) ($arkRef->descr_en ?: $arkRef->descr)) : ((string) $arkRef->descr ?: $arkRef->descr_en); } $arkSourceShort = function ($code) use ($arkSourceLabel) { $label = $arkSourceLabel[(string) $code] ?? (string) $code; return mb_strlen($label) > 24 ? str_replace('_', ' ', (string) $code) : $label; }; $arkMediaTypeLabel = []; foreach (DB::table('ref')->where('cat', 'MEDIA_TYPE')->get() as $arkRef) { $arkMediaTypeLabel[(string) $arkRef->code] = $arkLang === 'en' ? ((string) ($arkRef->descr_en ?: $arkRef->descr)) : ((string) $arkRef->descr ?: $arkRef->descr_en); } /* --- 2b. content_speeches → Teks Ucapan --- Corak: baris induk (speech_parent_id NULL) + baris terjemahan (anak) yang boleh ada tajuk & fail sendiri. Status guna SPEECH_STATUS = PUBLISHED. */ $arkSpeechLabel = []; foreach (DB::table('ref')->where('cat', 'SPEECH_CATEGORY')->get() as $arkRef) { $arkSpeechLabel[(string) $arkRef->code] = $arkLang === 'en' ? ((string) ($arkRef->descr_en ?: $arkRef->descr)) : ((string) $arkRef->descr ?: $arkRef->descr_en); } $arkSpeechRows = DB::table('content_speeches') ->whereIn('speech_status', ['PUBLISHED', 'ACTIVE']) ->where(function ($q) use ($arkToday) { $q->whereNull('speech_start_date')->orWhere('speech_start_date', '')->orWhere('speech_start_date', '<=', $arkToday); }) ->where(function ($q) use ($arkToday) { $q->whereNull('speech_end_date')->orWhere('speech_end_date', '')->orWhere('speech_end_date', '>=', $arkToday); }) ->orderByDesc('speech_date') ->orderByDesc('speech_id') ->get(); $arkSpeechParents = $arkSpeechRows->filter(fn ($r) => blank($r->speech_parent_id))->values(); $arkSpeechChildren = $arkSpeechRows->filter(fn ($r) => filled($r->speech_parent_id))->groupBy('speech_parent_id'); foreach ($arkSpeechParents as $arkSpeech) { $arkKids = $arkSpeechChildren[$arkSpeech->speech_id] ?? collect(); $arkTrRow = $arkKids->firstWhere('speech_language', $arkLang); if (! $arkTrRow || blank($arkTrRow->speech_title)) { $arkTrRow = $arkSpeech; } $arkItems[] = [ 'jenis' => 'ucapan', 'date' => (string) ($arkSpeech->speech_date ?? ''), 'title' => (string) ($arkTrRow->speech_title ?? ''), 'summary' => '', 'file' => $arkFile($arkTrRow->speech_file ?: $arkSpeech->speech_file), 'img' => $arkFile($arkSpeech->speech_img), 'url' => '', 'source' => (string) ($arkSpeech->speech_speaker ?: $arkSpeech->speech_event), 'badge' => (string) ($arkSpeechLabel[(string) $arkSpeech->speech_category] ?? ''), ]; } /* --- 2c. content_article + content_article_translation → Berita --- */ $arkArticleRows = DB::table('content_article') ->whereIn('article_status', ['ACTIVE', 'PUBLISHED']) ->where(function ($q) use ($arkToday) { $q->whereNull('article_start_date')->orWhere('article_start_date', '')->orWhere('article_start_date', '<=', $arkToday); }) ->where(function ($q) use ($arkToday) { $q->whereNull('article_end_date')->orWhere('article_end_date', '')->orWhere('article_end_date', '>=', $arkToday); }) ->orderByDesc('article_date') ->orderByDesc('article_id') ->get(); $arkArticleIds = $arkArticleRows->pluck('article_id')->all(); $arkArticleTr = $arkArticleIds ? DB::table('content_article_translation') ->whereIn('article_translation_parent_id', $arkArticleIds) ->get() ->groupBy('article_translation_parent_id') : collect(); foreach ($arkArticleRows as $arkRow) { $arkTrRows = $arkArticleTr[$arkRow->article_id] ?? collect(); $arkTrRow = $arkTrRows->firstWhere('article_translation_language', $arkLang) ?? $arkTrRows->firstWhere('article_translation_main', 1) ?? $arkTrRows->first(); $arkItems[] = [ 'jenis' => 'berita', 'date' => (string) ($arkRow->article_date ?? ''), 'title' => (string) ($arkTrRow->article_translation_title ?? ''), 'summary' => (string) ($arkTrRow->article_translation_content ?? ''), 'file' => '', 'img' => $arkFile($arkRow->article_image), 'url' => (string) ($arkRow->article_url ?? ''), 'source' => (string) ($arkRow->article_subcategory ?: $arkRow->article_category), 'badge' => '', ]; } /* --- 2a. content_media → Kenyataan Media / Keratan Akhbar --- */ $arkMediaBuckets = [ 'kenyataan' => ['KENYATAAN_MEDIA', 'SIARAN_MEDIA'], 'keratan' => ['KERATAN_AKHBAR'], ]; $arkMediaRows = DB::table('content_media') ->where('media_status', 'PUBLISHED') ->whereIn('media_type', ['KENYATAAN_MEDIA', 'SIARAN_MEDIA', 'KERATAN_AKHBAR']) ->orderByDesc('media_date') ->orderByDesc('media_id') ->get(); $arkMediaIds = $arkMediaRows->pluck('media_id')->all(); $arkMediaTr = $arkMediaIds ? DB::table('content_media_translations') ->whereIn('media_translation_parent_id', $arkMediaIds) ->get() ->groupBy('media_translation_parent_id') : collect(); foreach ($arkMediaRows as $arkRow) { $arkBucket = null; foreach ($arkMediaBuckets as $arkKey => $arkTypes) { if (in_array((string) $arkRow->media_type, $arkTypes, true)) { $arkBucket = $arkKey; break; } } if ($arkBucket === null) { continue; } $arkTrRows = $arkMediaTr[$arkRow->media_id] ?? collect(); $arkTrRow = $arkTrRows->firstWhere('media_translation_language', $arkLang) ?? $arkTrRows->firstWhere('media_translation_main', 1) ?? $arkTrRows->first(); $arkItems[] = [ 'jenis' => $arkBucket, 'date' => (string) ($arkRow->media_date ?? ''), 'title' => (string) ($arkTrRow->media_translation_title ?? ''), 'summary' => (string) ($arkTrRow->media_translation_summary ?? ''), 'file' => $arkFile($arkRow->media_file), 'img' => $arkFile($arkRow->media_img), 'url' => (string) ($arkRow->media_url ?? ''), 'source' => $arkRow->media_source ? $arkSourceShort($arkRow->media_source) : '', 'badge' => (string) ($arkMediaTypeLabel[(string) $arkRow->media_type] ?? ''), ]; } /* -------------------------------------------------------------------- | 3. Kiraan, tab tahun, penapis & data hab -------------------------------------------------------------------- */ $arkCounts = []; foreach ($arkJenisKeys as $arkKey) { $arkCounts[$arkKey] = count(array_filter($arkItems, fn ($i) => $i['jenis'] === $arkKey)); } $arkTotal = count($arkItems); // Item bagi jenis yang dipilih sahaja (tab tahun & jadual ikut jenis) $arkJenisItems = $arkJenis === '' ? [] : array_values(array_filter($arkItems, fn ($i) => $i['jenis'] === $arkJenis)); $arkYears = []; $arkUndated = 0; foreach ($arkJenisItems as $arkItem) { $arkYear = $arkItem['date'] !== '' ? substr($arkItem['date'], 0, 4) : ''; if (preg_match('/^\d{4}$/', $arkYear)) { $arkYears[$arkYear] = ($arkYears[$arkYear] ?? 0) + 1; } else { $arkUndated++; } } krsort($arkYears); // Buang nilai penapis yang tidak sah if ($arkTahun !== '' && $arkTahun !== 'lain' && ! isset($arkYears[$arkTahun])) { $arkTahun = ''; } if ($arkTahun === 'lain' && $arkUndated === 0) { $arkTahun = ''; } $arkRows = array_values(array_filter($arkJenisItems, function ($arkItem) use ($arkTahun) { if ($arkTahun === '') { return true; } $arkYear = $arkItem['date'] !== '' ? substr($arkItem['date'], 0, 4) : ''; $arkIsYear = (bool) preg_match('/^\d{4}$/', $arkYear); if ($arkTahun === 'lain') { return ! $arkIsYear; } return $arkYear === $arkTahun; })); if ($arkCari !== '') { $arkRows = array_values(array_filter($arkRows, fn ($i) => mb_stripos($i['title'], $arkCari) !== false)); } $arkIsFiltered = $arkTahun !== '' || $arkCari !== ''; // Label kolum kedua-terakhir ikut jenis $arkColMeta = [ 'berita' => ['ms' => 'Kategori', 'en' => 'Category'], 'ucapan' => ['ms' => 'Penyampai', 'en' => 'Speaker'], 'kenyataan' => ['ms' => 'Sumber', 'en' => 'Source'], 'keratan' => ['ms' => 'Akhbar', 'en' => 'Newspaper'], ]; $arkColLabel = $arkJenis !== '' ? ($arkColMeta[$arkJenis][$arkLang] ?? 'Sumber') : ($arkLang === 'en' ? 'Source' : 'Sumber'); // Hab: ringkasan setiap jenis (jumlah + julat tahun) $arkHub = []; foreach ($arkJenisKeys as $arkKey) { $arkKeyItems = array_values(array_filter($arkItems, fn ($i) => $i['jenis'] === $arkKey)); $arkKeyYears = []; foreach ($arkKeyItems as $arkItem) { $arkYear = $arkItem['date'] !== '' ? substr($arkItem['date'], 0, 4) : ''; if (preg_match('/^\d{4}$/', $arkYear)) { $arkKeyYears[$arkYear] = true; } } $arkKeyYears = array_keys($arkKeyYears); rsort($arkKeyYears); $arkHub[$arkKey] = [ 'count' => count($arkKeyItems), 'years' => $arkKeyYears, 'latest' => (string) ($arkKeyItems[0]['date'] ?? ''), ]; } // Jumlah item tanpa tarikh (untuk chip "Lain-lain") $arkJenisLabelText = $arkJenis !== '' ? $arkJenisLabel($arkJenis) : ''; @endphp
{{-- ============================ BREADCRUMB ============================ --}} {{-- ============================== TAJUK ============================== --}}
Media

{{ $arkJenis !== '' ? $arkJenisLabelText : ($arkLang === 'en' ? 'Electronic Archive' : 'Arkib Elektronik') }}

@if ($arkJenis !== '') {{ $arkJenisDefs[$arkJenis][$arkLang === 'en' ? 'descr_en' : 'descr_ms'] }} @elseif ($arkLang === 'en') Archive of ministry documents and publications — news, speeches, media statements and newspaper clippings — organised by year. @else Koleksi arkib dokumen dan penerbitan kementerian — berita, teks ucapan, kenyataan media dan keratan akhbar — disusun mengikut tahun. @endif

{{-- ============================ TAB JENIS ============================ --}} @if ($arkJenis === '') {{-- ============================== HAB ============================== --}} @else {{-- --------------------------- PENAPIS --------------------------- --}}
{{ $arkLang === 'en' ? 'Year' : 'Tahun' }} {{ $arkLang === 'en' ? 'All' : 'Semua' }} @foreach ($arkYears as $arkYearKey => $arkYearCount) {{ $arkYearKey }} ({{ $arkYearCount }}) @endforeach @if ($arkUndated > 0) {{ $arkLang === 'en' ? 'Others' : 'Lain-lain' }} ({{ $arkUndated }}) @endif
{{-- --------------------------- KIRAAN --------------------------- --}}
@if ($arkIsFiltered) {{ $arkLang === 'en' ? 'Showing' : 'Menunjukkan' }} {{ count($arkRows) }} {{ $arkLang === 'en' ? 'of' : 'daripada' }} {{ count($arkJenisItems) }} {{ $arkLang === 'en' ? 'documents' : 'dokumen' }} @else {{ $arkLang === 'en' ? 'Total' : 'Jumlah' }} {{ count($arkRows) }} {{ $arkLang === 'en' ? 'documents' : 'dokumen' }} @endif {{ $arkJenisLabelText }} @if ($arkTahun !== '') {{ $arkTahun === 'lain' ? ($arkLang === 'en' ? 'Others' : 'Lain-lain') : $arkTahun }} @endif @if ($arkCari !== '') “{{ $arkCari }}” @endif
{{-- --------------------------- JADUAL --------------------------- --}} @if (count($arkRows) > 0)
@foreach ($arkRows as $arkIndex => $arkItem) @endforeach
# {{ $arkLang === 'en' ? 'Date' : 'Tarikh' }} {{ $arkLang === 'en' ? 'Title' : 'Tajuk' }} {{ $arkColLabel }} {{ $arkLang === 'en' ? 'Document' : 'Dokumen' }}
{{ $arkIndex + 1 }} {{ $arkItem['date'] !== '' ? $arkDate($arkItem['date']) : ($arkLang === 'en' ? 'No date' : 'Tiada tarikh') }}

@if ($arkItem['file'] !== '') {{ $arkItem['title'] }} @elseif ($arkItem['url'] !== '') {{ $arkItem['title'] }} @else {{ $arkItem['title'] }} @endif

@if ($arkItem['badge'] !== '' && $arkItem['badge'] !== $arkJenisLabelText)
{{ $arkItem['badge'] }}
@endif
{{ $arkItem['source'] !== '' ? $arkItem['source'] : '—' }}
@if ($arkItem['file'] !== '') {{ $arkLang === 'en' ? 'Download' : 'Muat turun' }} @elseif ($arkItem['url'] !== '') {{ $arkLang === 'en' ? 'Open link' : 'Buka pautan' }} @else — @endif
@else
{{ $arkLang === 'en' ? 'No documents found' : 'Tiada dokumen ditemui' }}

@if ($arkIsFiltered) {{ $arkLang === 'en' ? 'No documents match this year or search. Try another filter.' : 'Tiada dokumen sepadan dengan tahun atau carian ini. Cuba penapis lain.' }} @else {{ $arkLang === 'en' ? 'No documents have been published in this archive yet.' : 'Belum ada dokumen diterbitkan dalam arkib ini.' }} @endif

@if ($arkIsFiltered) {{ $arkLang === 'en' ? 'Reset filters' : 'Set semula penapis' }} @endif
@endif @endif {{-- =============================== NOTA ============================== --}}
{{ $arkLang === 'en' ? 'Archive note' : 'Nota arkib' }}: @if ($arkLang === 'en') Documents are kept in PDF format. For a document that cannot be opened or for any enquiry, please contact the Corporate Communications Division at +603 8091 7000. @else Dokumen disimpan dalam format PDF. Bagi dokumen yang tidak dapat dibuka atau sebarang pertanyaan, sila hubungi Bahagian Komunikasi Korporat di talian +603 8091 7000. @endif