Seluruh halaman, konfigurasi dan penyimpanan buku tamu menggunakan PHP. Kesepuluh konsep memiliki tata letak, font, musik dan rangkaian amplop–ilustrasi–banner berbeda. Semua memuat QS. Ar-Rum 30:21, transfer bank, ucapan publik dan RSVP privat.
mod_rewrite. Tidak membutuhkan Python, Composer, MySQL atau SQLite.public_html atau subfolder, misalnya public_html/undangan. Sertakan .htaccess; aktifkan tampilan hidden files pada file manager jika perlu._private/storage dapat ditulis oleh PHP (umumnya izin 755 dengan owner hosting yang benar; sesuaikan bila hosting meminta). Buka alamat hosting. URL tema berupa /keraton-prameswari atau /undangan/keraton-prameswari. Basis subfolder dideteksi otomatis.Dari folder paket jalankan:
php -S 127.0.0.1:8000 router.php
Lalu buka http://127.0.0.1:8000. File PHP harus dibuka melalui server PHP, bukan dengan double-click. URL lokal juga rapi.
Contoh tautan tamu: /keraton-prameswari?to=Budi%20dan%20Keluarga. Query nama tamu tetap berfungsi. Jika hosting belum mengaktifkan rewrite, alternatifnya /index.php?theme=keraton-prameswari&to=Budi. Agar tautan koleksi yang rapi berfungsi, aktifkan rewrite atau minta hosting memeriksa .htaccess.
PHP mengirim Cache-Control: no-store, no-cache, must-revalidate, max-age=0, Pragma dan Expires untuk halaman/API. .htaccess juga mengatur header aset dan mematikan ETag bila modulnya tersedia. CSS/JS/foto memakai versi hash otomatis, sehingga perubahan file menghasilkan URL aset baru. Permintaan formulir memakai cache: no-store. Jika hosting/CDN memaksa cache, nonaktifkan aturan tersebut atau lakukan purge di panel hosting. Menonaktifkan cache seluruh aset menambah penggunaan bandwidth.
Nginx tidak membaca .htaccess: administrator perlu meneruskan URL yang tidak cocok dengan file ke index.php, memblokir folder _private/views/templates, dan menyamakan header cache untuk aset. Hosting harus mengeksekusi PHP; static hosting tidak cukup.
Setiap tema mempunyai konfigurasi PHP pada _private/config/NAMA-TEMA.php. Edit banks:
'banks' => [
['bank' => 'BCA', 'number' => '', 'holder' => 'Roni'],
['bank' => 'Mandiri', 'number' => '', 'holder' => 'Dita'],
],Isi number dengan nomor rekening asli sebagai string (tetap gunakan tanda petik, terutama jika nomor diawali 0). Nama bank dan pemilik dapat diganti; jumlah bank bisa ditambah. Tombol salin aktif setelah nomor diisi. Saat kosong, kartu bank tetap terlihat dengan status belum tersedia. Tidak ada nomor rekening palsu dan tidak ada proses pembayaran otomatis.
Dalam konfigurasi yang sama, ganti data mempelai, orang tua, tanggal, tempat, peta, cerita, streaming, alamat kado dan WhatsApp. Semua tanggal dan tempat masih contoh. Foto yang disertakan adalah pasangan fiktif hasil AI, bukan foto asli Roni dan Dita.
Atur prewedPhoto, backgroundOpacity, heroPhotoOpacity, foto profil dan array gallery. Galeri menerima banyak foto, dimuat bertahap (default 12), dengan lazy loading, lightbox, tombol panah dan swipe. Kompres foto menjadi WebP agar cepat pada ponsel. Nama file dekoratif pada view template PHP juga dapat diganti.
Siapa pun dapat mengirim ucapan dengan nama bebas, tanpa akun dan tanpa RSVP. Nama dan ucapan tampil setelah persetujuan pengirim. RSVP disimpan terpisah dan tidak tampil di buku tamu publik. Semua sepuluh contoh berbagi invitationId Roni & Dita; ganti ID untuk pasangan lain.
Buka /admin. Ambil token dari file _private/storage/admin-key.php melalui file manager hosting; salin nilai string setelah return. File ini tidak dapat dibuka lewat URL. Token juga dapat diatur melalui environment ADMIN_TOKEN (minimal 20 karakter). Halaman admin dapat mengekspor JSON dan menghapus ucapan/RSVP. Token tidak disimpan oleh halaman admin.
Data ada di _private/storage/guestbook.php, berisi JSON dengan pelindung PHP dan pembatasan akses folder. Penulisan memakai penguncian file dan penggantian atomik. Cadangkan seluruh folder storage secara privat. Paket tidak menyertakan data tamu atau token admin. Untuk banyak undangan dengan trafik tinggi, penyimpanan dapat dipindahkan ke database oleh pengembang.
Batas kiriman: nama 100 karakter, ucapan 2000 karakter, dan 120 kiriman per IP per jam; sesuaikan environment POST_LIMIT bila diperlukan. Jika layanan PHP gagal, formulir menampilkan status tidak tersedia sehingga tamu tidak diberi kesan bahwa ucapan telah tersimpan bersama.
Teks Arab diperiksa terhadap Quran NU Online dan Quran.com. Bagian Indonesia berlabel “Makna ayat” merupakan parafrasa makna, bukan kutipan resmi terjemahan Kemenag. Ayat ditampilkan sebagai teks Unicode dengan arah kanan ke kiri dan font pendukung Arab lokal.
| Tema | URL | Konfigurasi |
|---|---|---|
| Keraton Prameswari | /keraton-prameswari | _private/config/keraton-prameswari.php |
| Lakon Asmaradana | /lakon-asmaradana | _private/config/lakon-asmaradana.php |
| Taman Melati | /taman-melati | _private/config/taman-melati.php |
| Batik Editorial | /batik-editorial | _private/config/batik-editorial.php |
| Rumah Pendopo | /rumah-pendopo | _private/config/rumah-pendopo.php |
| Orbit Rembulan | /orbit-rembulan | _private/config/orbit-rembulan.php |
| Layang Katresnan | /layang-katresnan | _private/config/layang-katresnan.php |
| Tirta Tamansari | /tirta-tamansari | _private/config/tirta-tamansari.php |
| Gunungan Selawase | /gunungan-selawase | _private/config/gunungan-selawase.php |
| Fajar Merapi | /fajar-merapi | _private/config/fajar-merapi.php |
Sepuluh instrumental original sintetis (48 detik, loop) berbeda motif/instrumen. Musik mulai setelah klik buka dan dapat dimatikan. Pembuka baru sekitar 6,5 detik dengan lewati dan putar ulang; reduced motion dihormati. Font lokal beserta lisensinya disertakan.
Pemeriksaan PHP mencakup sintaks, rute semua tema, basis subfolder, header cache, versi aset, ucapan nama bebas, pagination, RSVP, admin dan proteksi file. Pemeriksaan logika animasi memakai simulasi DOM/timer; rendering visual browser belum diverifikasi.