%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<?php
/**
* Halaman publik: detail Berita.
*/
require_once __DIR__ . '/config/config.php';
require_once __DIR__ . '/includes/queries.php';
$slug = get_param('slug');
$b = $slug !== '' ? get_berita_by_slug($slug) : null;
if (!$b || $b['status'] !== 'publish') {
http_response_code(404);
$pageTitle = t('Berita') . ' — 404';
require __DIR__ . '/partials/head.php';
require __DIR__ . '/partials/navbar.php';
echo '<main class="max-w-3xl mx-auto px-4 py-24 text-center w-full">'
. '<i class="fas fa-newspaper text-5xl text-slate-300 mb-4"></i>'
. '<h1 class="text-2xl font-bold text-slate-800 mb-2">404</h1>'
. '<p class="text-slate-500 mb-6">' . e(t('Belum ada berita yang dipublikasikan.')) . '</p>'
. '<a href="' . e(url('berita.php')) . '" class="inline-flex items-center gap-2 bg-mateng-green text-white px-5 py-2.5 rounded-lg font-semibold"><i class="fas fa-arrow-left"></i> ' . e(t('Kembali ke Berita')) . '</a></main>';
require __DIR__ . '/partials/footer.php';
exit;
}
// Tambah penghitung dilihat.
db()->prepare('UPDATE berita SET views = views + 1 WHERE id = ?')->execute([$b['id']]);
// Foto galeri untuk slideshow (fallback ke sampul bila belum ada baris berita_foto).
$fst = db()->prepare('SELECT file FROM berita_foto WHERE berita_id = ? ORDER BY urutan ASC, id ASC');
$fst->execute([$b['id']]);
$fotos = [];
foreach ($fst->fetchAll(PDO::FETCH_COLUMN) as $ff) {
if (is_file(UPLOAD_PATH . '/berita/' . $ff)) { $fotos[] = UPLOAD_URL . '/berita/' . $ff; }
}
if (!$fotos && !empty($b['gambar']) && is_file(UPLOAD_PATH . '/berita/' . $b['gambar'])) {
$fotos[] = UPLOAD_URL . '/berita/' . $b['gambar'];
}
// URL absolut untuk tombol Bagikan.
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$shareUrl = $scheme . '://' . ($_SERVER['HTTP_HOST'] ?? '') . ($_SERVER['REQUEST_URI'] ?? '');
$shareTxt = $b['judul'];
// Berita lain (selain ini).
$lain = db()->prepare(
"SELECT judul, slug, COALESCE(published_at, created_at) AS tanggal FROM berita
WHERE status = 'publish' AND id <> ? ORDER BY COALESCE(published_at, created_at) DESC LIMIT 4"
);
$lain->execute([$b['id']]);
$beritaLain = $lain->fetchAll();
$pageTitle = $b['judul'] . ' — ' . APP_NAME_SHORT;
$activeNav = 'berita';
require __DIR__ . '/partials/head.php';
require __DIR__ . '/partials/navbar.php';
?>
<?php require __DIR__ . '/partials/berita-konten-style.php'; ?>
<main class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-10 w-full">
<nav class="text-sm text-slate-500 mb-6">
<a href="<?= e(url('index.php')) ?>" class="hover:text-mateng-green"><?= e(t('Beranda')) ?></a><span class="mx-2">/</span>
<a href="<?= e(url('berita.php')) ?>" class="hover:text-mateng-green"><?= e(t('Berita')) ?></a><span class="mx-2">/</span>
<span class="text-slate-700">Detail</span>
</nav>
<article class="bg-white rounded-2xl border border-slate-100 shadow-sm overflow-hidden">
<?php if ($fotos): ?>
<div id="beritaSlider" class="relative bg-slate-900 select-none" data-total="<?= count($fotos) ?>">
<div class="overflow-hidden">
<div id="beritaTrack" class="flex transition-transform duration-500 ease-out">
<?php foreach ($fotos as $src): ?>
<img src="<?= e($src) ?>" alt="<?= e($b['judul']) ?>" class="w-full shrink-0 h-[280px] sm:h-[420px] object-cover">
<?php endforeach; ?>
</div>
</div>
<?php if (count($fotos) > 1): ?>
<button type="button" data-dir="-1" class="slider-nav absolute left-3 top-1/2 -translate-y-1/2 w-10 h-10 rounded-full bg-white/85 hover:bg-white text-slate-800 shadow-lg flex items-center justify-center" aria-label="Sebelumnya"><i class="fas fa-chevron-left"></i></button>
<button type="button" data-dir="1" class="slider-nav absolute right-3 top-1/2 -translate-y-1/2 w-10 h-10 rounded-full bg-white/85 hover:bg-white text-slate-800 shadow-lg flex items-center justify-center" aria-label="Berikutnya"><i class="fas fa-chevron-right"></i></button>
<span class="absolute top-3 right-3 bg-black/50 text-white text-xs px-2.5 py-1 rounded-full"><span id="beritaCounter">1</span>/<?= count($fotos) ?></span>
<div class="absolute bottom-3 inset-x-0 flex justify-center gap-2">
<?php foreach ($fotos as $k => $src): ?>
<button type="button" data-idx="<?= $k ?>" class="slider-dot h-2.5 rounded-full bg-white/60 transition-all" aria-label="Foto <?= $k + 1 ?>"></button>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="p-6 sm:p-10">
<h1 class="text-2xl md:text-3xl font-bold text-slate-900 leading-snug mb-4"><?= e($b['judul']) ?></h1>
<div class="flex flex-wrap items-center gap-4 text-sm text-slate-500 mb-6 pb-6 border-b border-slate-100">
<span><i class="far fa-calendar mr-1.5"></i><?= e(tanggal_id($b['tanggal'], true)) ?></span>
<?php if (!empty($b['penulis'])): ?><span><i class="far fa-user mr-1.5"></i><?= e($b['penulis']) ?></span><?php endif; ?>
<span><i class="far fa-eye mr-1.5"></i><?= (int) $b['views'] ?> <?= e(t('kali dilihat')) ?></span>
<div class="flex items-center gap-1.5 w-full sm:w-auto sm:ml-auto">
<span class="text-xs text-slate-400 mr-0.5">Bagikan:</span>
<a href="https://wa.me/?text=<?= rawurlencode($shareTxt . ' — ' . $shareUrl) ?>" target="_blank" rel="noopener" aria-label="Bagikan ke WhatsApp" class="w-8 h-8 rounded-full bg-slate-100 hover:bg-green-500 hover:text-white text-slate-500 flex items-center justify-center transition-colors"><i class="fab fa-whatsapp"></i></a>
<a href="https://www.facebook.com/sharer/sharer.php?u=<?= rawurlencode($shareUrl) ?>" target="_blank" rel="noopener" aria-label="Bagikan ke Facebook" class="w-8 h-8 rounded-full bg-slate-100 hover:bg-blue-600 hover:text-white text-slate-500 flex items-center justify-center transition-colors"><i class="fab fa-facebook-f"></i></a>
<a href="https://twitter.com/intent/tweet?url=<?= rawurlencode($shareUrl) ?>&text=<?= rawurlencode($shareTxt) ?>" target="_blank" rel="noopener" aria-label="Bagikan ke X" class="w-8 h-8 rounded-full bg-slate-100 hover:bg-slate-900 hover:text-white text-slate-500 flex items-center justify-center transition-colors"><i class="fab fa-x-twitter"></i></a>
<a href="https://t.me/share/url?url=<?= rawurlencode($shareUrl) ?>&text=<?= rawurlencode($shareTxt) ?>" target="_blank" rel="noopener" aria-label="Bagikan ke Telegram" class="w-8 h-8 rounded-full bg-slate-100 hover:bg-sky-500 hover:text-white text-slate-500 flex items-center justify-center transition-colors"><i class="fab fa-telegram"></i></a>
<button type="button" onclick="salinTautanBerita(this)" data-url="<?= e($shareUrl) ?>" aria-label="Salin tautan" class="w-8 h-8 rounded-full bg-slate-100 hover:bg-mateng-green hover:text-white text-slate-500 flex items-center justify-center transition-colors"><i class="fas fa-link"></i></button>
</div>
</div>
<?php if (!empty($b['ringkasan'])): ?>
<p class="text-lg text-slate-600 font-medium leading-relaxed mb-6"><?= e($b['ringkasan']) ?></p>
<?php endif; ?>
<div class="berita-konten max-w-none text-slate-700 leading-relaxed">
<?php
$konten = (string) $b['konten'];
if (preg_match('/<[a-z][\s\S]*>/i', $konten)) {
echo sanitize_html($konten);
} else {
foreach (preg_split('/\n\s*\n/', trim($konten)) as $par) {
echo '<p>' . nl2br(e($par)) . '</p>';
}
}
?>
</div>
</div>
</article>
<?php if (!empty($beritaLain)): ?>
<div class="mt-10">
<h2 class="font-bold text-slate-800 mb-4"><?= e(t('Berita Lainnya')) ?></h2>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<?php foreach ($beritaLain as $bl): ?>
<a href="<?= e(url('berita-detail.php?slug=' . urlencode($bl['slug']))) ?>" class="flex items-center gap-3 bg-white border border-slate-100 rounded-xl p-4 hover:border-mateng-green/40 hover:shadow-sm transition-all">
<div class="w-10 h-10 rounded-lg bg-mateng-green/10 text-mateng-green flex items-center justify-center shrink-0"><i class="fas fa-newspaper"></i></div>
<div class="min-w-0">
<p class="font-semibold text-slate-800 text-sm truncate"><?= e($bl['judul']) ?></p>
<p class="text-xs text-slate-400"><?= e(tanggal_id($bl['tanggal'])) ?></p>
</div>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<div class="mt-8">
<a href="<?= e(url('berita.php')) ?>" class="inline-flex items-center gap-2 text-mateng-green font-semibold hover:underline"><i class="fas fa-arrow-left"></i> <?= e(t('Kembali ke Berita')) ?></a>
</div>
</main>
<script>
// Slideshow foto berita
(function () {
var slider = document.getElementById('beritaSlider');
var track = document.getElementById('beritaTrack');
if (!slider || !track) return;
var total = parseInt(slider.getAttribute('data-total') || '1', 10);
if (total < 2) return;
var idx = 0;
var dots = slider.querySelectorAll('.slider-dot');
var counter = document.getElementById('beritaCounter');
function go(n) {
idx = (n + total) % total;
track.style.transform = 'translateX(-' + (idx * 100) + '%)';
dots.forEach(function (d, i) { d.className = 'slider-dot h-2.5 rounded-full transition-all ' + (i === idx ? 'bg-white w-5' : 'bg-white/60 w-2.5'); });
if (counter) counter.textContent = (idx + 1);
}
slider.querySelectorAll('.slider-nav').forEach(function (b) {
b.addEventListener('click', function () { go(idx + parseInt(b.getAttribute('data-dir'), 10)); });
});
dots.forEach(function (d) { d.addEventListener('click', function () { go(parseInt(d.getAttribute('data-idx'), 10)); }); });
go(0);
var timer = setInterval(function () { go(idx + 1); }, 6000);
slider.addEventListener('mouseenter', function () { clearInterval(timer); });
})();
// Salin tautan berita
function salinTautanBerita(btn) {
var url = btn.getAttribute('data-url');
var done = function () {
var i = btn.querySelector('i'); if (!i) return;
var old = i.className; i.className = 'fas fa-check';
setTimeout(function () { i.className = old; }, 1500);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url).then(done, function () { window.prompt('Salin tautan:', url); });
} else {
window.prompt('Salin tautan:', url);
}
}
</script>
<?php require __DIR__ . '/partials/footer.php'; ?>