PANEL KONTEN — VERSI 3

PEMASANGAN BARU
1. Hosting harus mendukung PHP 7.4+ (disarankan PHP 8.x).
2. Upload dan ekstrak ZIP ke public_html. Folder panel-konten akan terbentuk.
3. Edit panel-konten/config.php melalui File Manager cPanel.
   Isi PIN berupa tepat 6 digit angka, diapit petik. Contoh format:
   return ['pin' => '012345', 'session_name' => 'panel_konten'];
   Gunakan PIN milik sendiri. Nol di awal tetap didukung.
4. Buka https://domainkamu.com/panel-konten/ lalu masuk menggunakan PIN.
5. Tidak membutuhkan database MySQL, Composer, GD, atau ekstensi ZipArchive.
6. Pastikan data/, templates/, dan media/ dapat ditulis oleh user PHP hosting.
   Biasanya 0755 dengan kepemilikan yang benar; jangan gunakan 0777.

JIKA SUDAH MEMASANG VERSI SEBELUMNYA
Lihat UPGRADE.txt agar daftar template, toko, dan aset lama tidak tertimpa.

SIAPKAN ASET MELALUI FILE MANAGER CPANEL
Setiap toko punya folder sendiri:
media/sumbu/logo.webp
media/sumbu/favicon.webp
media/sumbu/banners/          <- upload banyak banner .webp ke sini
media/cupu/logo.webp
media/cupu/favicon.webp
media/cupu/banners/
media/roso/logo.webp
media/roso/favicon.webp
media/roso/banners/

- Logo/favikon asli belum disertakan karena belum diberikan.
- Upload file WebP asli, bukan JPG/PNG yang hanya diganti ekstensinya.
- Nama sumber logo dan favicon harus logo.webp dan favicon.webp.
- Nama sumber banner bebas, asalkan ekstensi .webp.
- Maksimal tiap gambar 20 MB.
- Di Config ada ringkasan lokasi media, ketersediaan logo/favicon, dan jumlah stok.
- Toko baru: isi folder media saat menambah toko melalui Config. Folder dibuat otomatis.

MEMBUAT SATU ATAU BANYAK KONTEN
1. Pilih toko dan template pada kartu Konten 1.
2. Isi nama file HTML, misalnya guide.html (atau index.html).
3. Isi sembilan kolom konten.
4. Klik Tambah konten untuk konten berikutnya. Bisa 5 atau lebih, maksimal 50 per paket.
   Toko dan template bisa berbeda untuk setiap konten. Tombol Hapus membuang kartu isian tersebut.
5. Klik Buat & unduh semua.
6. Setelah ZIP siap, halaman akan mencoba mengunduh otomatis. Jika browser memblokir, klik Unduh ZIP.
7. Unduh ulang dari Riwayat paket untuk memakai paket yang sama, tanpa mengambil banner tambahan.

ISI ZIP HASIL
konten-1/guide.html
konten-1/guide.txt
konten-1/<nama-logo-dari-URL>.webp
konten-1/<nama-favicon-dari-URL>.webp
konten-1/<nama-banner-dari-URL>.webp
konten-2/...
sitemap.txt

Setiap konten mendapat folder sendiri. Nama guide.html boleh sama di konten lain karena folder berbeda.
Nama HTML harus memakai huruf/angka/titik/tanda - atau _, tanpa path, dan berakhiran .html.
Nama guide.txt mengikuti nama HTML. Jika HTML index.html, TXT-nya index.txt.

SCRIPT SITEMAP TXT
- guide.txt berisi script PHP sitemap urlset seperti yang diminta, dengan satu canonical konten tersebut.
- sitemap.txt di akar ZIP berisi script PHP sitemapindex dengan seluruh canonical ditambah /sitemap.xml.
- Contoh canonical https://domain.com/guide.html akan menjadi https://domain.com/guide.html/sitemap.xml.
- Garis miring paling akhir dibersihkan sebelum menambahkan /sitemap.xml agar tidak ganda.
- Script menghasilkan tanggal hari eksekusi menggunakan date('Y-m-d').
- File TXT adalah SOURCE CODE PHP. File .txt tidak otomatis dijalankan oleh hosting. Untuk menyajikan XML, pasang source tersebut sebagai handler PHP lalu atur route/rewrite sitemap.xml pada hosting tujuan. Panel tidak mengubah konfigurasi hosting tujuan.

NAMA FILE GAMBAR
URL logo: https://domain.com/images/logo-brand.webp
Hasil ZIP: logo-brand.webp (isi dari media/<toko>/logo.webp).
URL favicon: https://domain.com/favicon-brand.webp
Hasil ZIP: favicon-brand.webp (isi dari media/<toko>/favicon.webp).
URL banner: https://domain.com/banner-guide.webp
Hasil ZIP: banner-guide.webp (isi dari banner acak milik toko).

- Ketiga nama gambar dalam satu konten harus berbeda agar tidak saling menimpa.
- Nama file URL harus berakhiran .webp; gunakan huruf/angka/titik/-/_.
- Query string URL tidak menjadi bagian nama file.
- Panel tidak mengambil gambar dari URL yang diisi. Sumber gambar selalu folder media toko di hosting panel.
- URL pada HTML tetap sesuai isian. Setelah ekstrak, upload aset ke lokasi publik yang cocok dengan URL tersebut (termasuk subfolder, jika URL memakai subfolder).

STOK BANNER & RIWAYAT PAKET
- Banner diambil acak tanpa pengulangan dalam paket maupun dari file stok yang sudah terpakai.
- Semua isian, aset, dan kecukupan stok diperiksa sebelum paket dibuat.
- Setelah ZIP selesai disimpan dan dicatat, file banner sumber dihapus otomatis.
- Logo dan favicon tidak dihapus.
- Jika proses gagal sebelum ZIP siap, stok tidak dihapus.
- Jika banner tidak dapat dihapus karena izin folder, file itu dicatat sebagai terpakai sehingga tidak akan dipilih lagi. Halaman memberi pesan untuk memeriksa izin.
- Bila koneksi putus setelah ZIP jadi, gunakan Riwayat paket, bukan membuat paket baru.
- Pengiriman ulang request yang sama memakai paket yang sama; tidak mengambil stok lagi.
- ZIP disimpan di data/packages/ agar bisa diunduh ulang oleh admin yang login.
- Riwayat menampilkan 10 paket terbaru. Semua paket tetap tersimpan sampai dihapus melalui cPanel.
- Untuk menghemat ruang disk, file *.zip.php lama boleh dihapus via cPanel. Pertahankan *.meta.php karena menjadi catatan konsumsi banner. Cadangkan folder data bila memindahkan panel.
- Jangan membuka atau menjalankan ZIP cache secara manual; unduh melalui panel.
- ZIP memakai metode STORE (tanpa kompresi) agar tidak memerlukan ekstensi tambahan.
- Maksimal total paket sekitar 512 MB. Gunakan lebih sedikit konten bila batas waktu/memori hosting kecil.

CONFIG
- Upload dan hapus template seperti versi sebelumnya. Template wajib memiliki 10 placeholder yang sama.
- Tambah, edit, hapus toko; nilai REDIRECT menerima URL HTTP/HTTPS atau potongan Base64.
- Folder toko harus unik. Mengubah nama folder di Config tidak memindahkan aset lama: upload/pindahkan aset ke folder yang ditampilkan.
- Menghapus toko tidak menghapus folder media maupun paket terdahulu.

PLACEHOLDER
{{CANONICAL}}, {{TITLE}}, {{DESKRIPSI}}, {{LOGOBRAND}}, {{FAVBRAND}},
{{BANNER}}, {{NAMABRAND}}, {{KWTARGET}}, {{AGEDOMAIN}}, {{REDIRECT}}.
REDIRECT ditentukan dari toko. Template memakai format array ["{{REDIRECT}}"].
Template Etsy terbaru sudah disertakan. Struktur HTML/CSS/JS tidak diformat ulang.
Penggantian literal mempertahankan format asli. Gunakan konten yang sesuai konteks template; tanda kutip atau HTML sembarangan dapat merusak atribut/JavaScript/JSON.

LOGIN & HOSTING
- PIN tepat 6 angka. Ganti melalui config.php; perubahan mengakhiri sesi lama.
- Setelah 5 kali PIN salah dari IP yang sama, login ditunda 5 menit, termasuk jika memakai sesi baru.
- Sesi berakhir setelah 1 jam tidak aktif.
- Gunakan HTTPS. Waktu riwayat mengikuti zona waktu PHP hosting.
- Template maksimal 20 MB. Jika perlu, atur upload_max_filesize 24M dan post_max_size 28M atau lebih.
- Untuk paket besar, sesuaikan memory_limit dan max_execution_time dengan kapasitas hosting.
- Bila ingin mengirim 50 konten, pastikan max_input_vars minimal 1000.

VALIDASI VERSI INI
Diuji langsung dengan PHP 8.3: batch 6 konten/3 toko (31 file ZIP), kesesuaian HTML dan aset, eksekusi kedua jenis script sitemap, stok tidak terpakai saat validasi gagal, penghapusan banner, unduh ulang tanpa konsumsi tambahan, serta PIN dan batas percobaan login.
Tampilan Builder dan Config diperiksa di browser pada lebar 390 dan 1440 piksel tanpa overflow horizontal. Penambahan/penghapusan hingga 50 kartu diuji. Login dan pengunduhan ZIP otomatis juga diuji lewat browser dengan ukuran layar HP.
