Apa itu PrizeX
PrizeX adalah platform hadiah, gaming, dan marketplace berbasis PHP: lelang, lotere, mystery box, kluster permainan arcade, toko e-commerce multi-penjual, dan ekonomi dompet/koin — semuanya dalam satu aplikasi self-hosted. Produk ini hadir dengan arsitektur plugin/tema, panel admin, dan 38 plugin payment gateway yang mencakup kartu, dompet digital, crypto, serta prosesor regional, ditambah 3 metode pembayaran manual yang disemai langsung oleh kernel.
Tidak ada lock-in SaaS: Anda memasangnya di hosting sendiri, memiliki databasenya, dan mendapat update seumur hidup pada lisensi tersebut. Setiap vertikal (lelang, lotere, mystery box, permainan, toko) bisa dinyalakan atau dimatikan sendiri-sendiri dari panel admin — instalasi baru bisa berjalan sebagai produk satu vertikal saja atau sebagai suite lengkap.
Kode inti tidak pernah bergantung mati pada satu plugin. Setiap vertikal, payment gateway, dan login sosial adalah plugin di dalam plugins/ yang bisa diaktifkan, dinonaktifkan, atau dihapus tanpa merusak bagian situs lainnya.
Prefiks tabel tbl_, tanpa ORM, sebagian besar memakai prepared statement. Setiap plugin memiliki dan memigrasikan tabelnya sendiri lewat installer db_delta() yang idempoten.
Berjalan di atas apa
PrizeX berjalan di hosting shared standar atau VPS — tanpa konfigurasi server khusus selain server web yang mendukung rewrite.
* Beberapa file di dalam database/migrations/ memakai ekstensi ADD COLUMN IF NOT EXISTS yang hanya ada di MariaDB. MySQL 8.0/8.4 biasa menolaknya — pakai MariaDB untuk databasenya, baik di development maupun production.
Menjalankan instalasi baru
Tidak ada wizard instalasi untuk penyiapan baru — Anda mengimpor skemanya langsung dan mengonfigurasi file environment.
- Pasang dependensi PHP:
composer install - Salin templat environment dan isi kredensial database Anda:
cp .env.example .env - Impor
database/production.sqlke database yang Anda sebut di.env— langkah ini membuat skema lengkapnya. - Ganti akun admin bawaan hasil seeding (lihat catatan di bawah), lalu masuk di
/admin/.
database/production.sql menyertakan satu baris tbl_admin (admin@wowcodes.in) yang hash password-nya sama persis di setiap instalasi. Hapus baris itu dan masukkan milik Anda sendiri sebelum situs live:
php -r "echo password_hash('your-password', PASSWORD_BCRYPT), \"\n\";"DELETE FROM tbl_admin;
INSERT INTO tbl_admin (username, email, password, image, status, permission_settings)
VALUES ('yourname', 'you@example.com', '<hash from the command above>', '', 1, 1);Untuk pengembangan lokal, server bawaan PHP jalan tanpa Apache: php -S localhost:8000 router.php — perlu dicatat, server ini mengabaikan .htaccess sepenuhnya, jadi router.php menerapkan ulang aturan routing yang sama secara manual (lihat Pengaturan server web).
Variabel environment
Semua pengaturan yang khusus per environment ada di .env, dimuat lewat vlucas/phpdotenv. Salin .env.example menjadi .env (diabaikan git) dan isi nilai sebenarnya untuk tiap environment — minimal kredensial database, sebelum skema diimpor.
Pengaturan seluruh situs yang tidak khusus per environment (nama aplikasi, mata uang, plugin aktif, tema aktif, dan sakelar per vertikal) tersimpan di database, pada tbl_settings, dan dikelola dari panel admin, bukan lewat file.
Pengaturan server web
Aturan routing dan keamanan — URL rapi, pemblokiran akses langsung ke .env/connection.php/log, dan pencegahan konten unggahan dieksekusi sebagai PHP — didefinisikan di file .htaccess yang tersebar di seluruh proyek. Apache dan LiteSpeed/OpenLiteSpeed membacanya secara native.
Di nginx, pakai nginx.conf.example, yang mencerminkan setiap aturan tadi sebagai blok server{} nginx — sesuaikan server_name, root, dan soket PHP-FPM dengan environment Anda.
.htaccess (production), router.php (server dev php -S lokal), dan nginx.conf.example (nginx) masing-masing menerapkan ulang aturan routing yang sama secara terpisah. Menambah rute URL rapi yang baru berarti memperbarui ketiganya.
Arsitektur request
Setiap halaman storefront (index.php, item.php, …) di-boot lewat includes/header.php, dengan urutan berikut:
connection.php memulai sesi, menyambung lewat mysqli memakai kredensial .env, memuat tbl_settings ke dalam konstanta seperti APP_NAME dan CURRENCY, lalu melogin pengguna saat ini beserta satu baris sidik jari perangkat. plugins_load() mem-boot setiap plugin aktif dan memicu hook plugins_loaded — di titik inilah kumpulan vertikal aktif yang sebenarnya baru diketahui, dan itulah sebabnya header.php memeriksa ulang flag pengaturan lama (shop, multivendor, auction, lottery) terhadap status plugin yang benar-benar aktif sesudahnya.
Panel admin tidak menduplikasi bootstrap ini — admin/includes/connection.php menetapkan konfigurasi sesi/error khusus admin lalu meng-include includes/connection.php yang sama di root.
Sistem plugin
Sebuah plugin adalah plugins/<slug>/plugin.php — metadata berupa komentar header yang diurai tanpa mengeksekusi filenya — ditambah plugin.json opsional untuk info katalog yang lebih lengkap. Plugin aktif disimpan sebagai array JSON di tbl_settings.active_plugins.
- Kepemilikan tabel — setiap plugin mendefinisikan
includes/schema.phpmiliknya sendiri, yang dipanggil saat aktivasi, memakai helperdb_delta()yang idempoten (CREATE TABLE IF NOT EXISTS+ALTER TABLE ADD COLUMNyang hanya menambah). Satu plugin tidak pernah menyentuh tabel milik plugin lain. - Registri dimuat lebih dulu —
add_admin_page,add_route,add_cron_job,add_api_route, danregister_modulesemuanya didefinisikan sebelum plugin mana pun dimuat, jadi pemanggilan di level teratas sebuah plugin tidak akan pernah fatal walaupun plugin itu ternyata tidak aktif. - Penghapusan bersih — menghapus plugin akan menjalankan
uninstall.phpmiliknya dan membuang foldernya; tidak boleh ada apa pun di luarplugins/<slug>/yang me-require filenya secara mati, jadi bagian situs lainnya tetap berjalan meski plugin itu sudah tidak ada.
Sistem tema
Sebuah tema berada di assets/themes/<slug>/ — berisi manifest.php, theme.css, functions.php untuk hook tema, dan components/ opsional. Tema aktif disimpan di tbl_settings.active_theme, dengan editorial sebagai cadangan kalau tidak ada yang disetel.
Pencarian komponen memeriksa, secara berurutan: folder components/ milik tema aktif, lalu direktori komponen yang dideklarasikan sebuah plugin lewat register_module(), lalu components/ bersama di root. Praktisnya, versi default bersama cukup ada sekali di components/, dan tema mana pun — atau plugin vertikal yang aktif — bisa menimpa jalur komponen tertentu dengan salinannya sendiri.
Database
Prefiks tabel tbl_, mysqli mentah, sebagian besar memakai prepared statement. File SQL, diurutkan menurut otoritasnya:
database/core-schema.sql— hanya tabel kernel yang dipelihara manual; tabel vertikal/plugin sengaja tidak disertakan.database/production.sql— dihasilkan otomatis (skema inti + rutin instalasi milik setiap plugin, di-dump dari database kosong). Inilah yang Anda impor untuk instalasi baru.database/sandbox.sql— dataset demo/awal untuk pengembangan lokal.database/migration.sql— skrip upgrade yang idempoten dan sudah digabung untuk instalasi yang sudah berjalan.database/migrations/<slug>/up.sql(+down.sqlkalau bisa dibalik) — satu file untuk setiap migrasi.
Modul
Setiap modul ikut dalam instalasi yang sama dan bisa dinyalakan atau dimatikan sendiri-sendiri dari panel admin.
Lelang
Bidding langsung dengan portal penjual multi-penjual dan mesin komisi. Plugin inti: plugins/auction.
Lotere
Undian bertiket dengan jadwal, hadiah, dan notifikasi pemenang yang bisa dikonfigurasi. Plugin inti: plugins/lottery.
Mystery box
Pool hadiah yang bisa dikonfigurasi lengkap dengan animasi pembukaan — pengguna membeli kotak dan langsung melihat apa yang mereka menangkan. Plugin: plugins/mystery-box.
Permainan & hadiah
Kluster arcade di dalam games/ ditambah plugin keterlibatan/penghasilan:
Toko & marketplace
Lapisan e-commerce multi-penjual dengan perkakas promosi dan merchandising. Plugin inti: plugins/shop, plugins/multivendor.
Dompet, koin & investasi
Satu dompet untuk seluruh platform yang dipakai bersama oleh semua modul.
Referral & hadiah
Autentikasi, kepercayaan & kepatuhan
Utilitas
Panel admin
Panel admin berada di dalam admin/ dan tidak menduplikasi bootstrap storefront — ia menetapkan konfigurasi sesi/error khusus admin, lalu meng-include includes/connection.php yang sama di root. Halaman didaftarkan lewat add_admin_page(), yang mengurus entri sidebar, pembatasan hak akses, CSRF, dan kerangka autentikasi; aksi JSON khusus admin didaftarkan lewat add_admin_ajax() dan disalurkan melalui admin/ajax.php?action=<slug>.
Item, banner, halaman, menu, blog.
Pengelolaan gateway otomatis & manual, peninjauan pembayaran manual, ekspor pencairan dana.
Grup pengguna, peran, detail penjual, impersonasi.
Ekspor transaksi/pesanan/pengguna, log cron, pelacakan error, log aktivitas admin.
Kampanye email, templat, newsletter, notifikasi push, log notifikasi.
Aktifkan/nonaktifkan plugin dan tema, pengaturan SEO per halaman, pengaturan seluruh situs.
Tema storefront
Lima tema disertakan di dalam assets/themes/ dan bisa diganti per instalasi dari panel admin. Setiap tema menyimpan salinannya sendiri atas komponen bersama di dalam folder components/ miliknya.
Tampilan sederhana dan modern dengan kartu putih dan bayangan lembut — pilihan aman dan serbaguna untuk hampir semua jenis toko.
Tampilan bersih bergaya majalah dengan nuansa kertas hangat dan tipografi tajam, untuk storefront yang rapi dan terpercaya.
Tema cadangan bawaanTema gelap yang berani dan mewah dengan aksen emas — dirancang agar terasa seru dan kelas atas.
Tampilan hangat dengan ornamen kaya yang terinspirasi pasar tradisional, lengkap dengan dukungan bahasa kanan-ke-kiri.
Tampilan musiman yang seram dan meriah — latar ungu pekat dengan sorotan oranye labu yang menyala.
Payment gateway
38 gateway otomatis dimiliki oleh plugin — masing-masing berada di folder plugins/gateway-<slug>/ sendiri dan mendaftarkan dirinya ke kernel lewat add_payment_gateway(). Mengaktifkan salah satunya langsung jalan; tidak ada apa pun di dispatcher checkout (payment_processor.php) yang dipaku ke gateway tertentu.
3 metode manual adalah baris gateway_type = 'manual' yang disemai kernel, tanpa kode init/verify untuk dikonfigurasi — ketiganya hanya menampilkan instruksi pembayaran atau kode QR. Plugin manual-gateway-builder memungkinkan admin menambah metode pembayaran manual kustom lain tanpa menyentuh kode.
Sebagian gateway (Stripe, Razorpay, Midtrans, Venmo) juga mendaftarkan hook render untuk alur checkout yang butuh JS sisi klien — bootstrap Stripe Checkout, atau SDK Razorpay/Midtrans/Braintree yang perlu ID pesanan atau token dibuat lebih dulu di sisi server. Semua gateway lain berjalan tanpa penyambungan tambahan di kernel sama sekali.
Lapisan API & AJAX
api/v1/— REST API terautentikasi JWT untuk aplikasi mobile dan konsumen eksternal.api/v1/middleware/*.phpmemvalidasi headerAuthorization: Bearer <token>. Plugin menambahkan endpoint miliknya sendiri lewatadd_api_route().ajax/— AJAX internal terautentikasi cookie sesi untuk JS milik storefront sendiri (keranjang, kupon, notifikasi). Tidak ada lapisan token — ia mengandalkan sesi PHP yang disiapkanconnection.php.- Folder
api/lepas di level teratas — endpoint serba-serbi tanpa versi sepertigeo_location.php,exchange-rate.php, danofferwall_postback.php.
Aplikasi mobile
mobile/ adalah proyek Capacitor + Ionic terpisah — pembungkus WebView di sekitar situs live, bukan SPA berdiri sendiri dan bukan pula sekadar konsumen api/v1. File capacitor.config.ts-nya mengarahkan server.url ke domain Anda. Proyek ini punya package.json sendiri dan tidak di-build dari root proyek:
cd mobile
npm run sync
npm run open:ios
npm run open:androidUpdate & migrasi
Ambil snapshot sebelum menjalankan database/migration.sql atau database/migrations/<slug>/up.sql mana pun terhadap database live:
mysqldump --single-transaction -u<user> -p<pass> <db> > pre-deploy-$(date +%Y%m%d-%H%M%S).sqlSebagian besar migrasi menyertakan down.sql pasangannya untuk membalik satu perubahan itu saja. Beberapa migrasi yang mengubah data yang sudah ada, bukan sekadar menambah struktur, justru menyertakan down.sql yang menjelaskan kenapa file itu tidak melakukan apa-apa — untuk kasus seperti itu, pulihkan dari dump sebelum deploy kalau Anda perlu rollback.
Catatan keamanan
- Ganti kredensial admin bawaan hasil seeding segera setelah impor (lihat Instalasi).
.env,connection.php, dan file log diblokir dari akses HTTP langsung oleh aturan.htaccess/ nginx yang disertakan — jangan hapus aturan-aturan itu.- Konten yang diunggah disajikan dengan cara yang mencegahnya dieksekusi sebagai PHP, dan itu ditegakkan di level konfigurasi server web, bukan di level aplikasi.
- Kredensial payment gateway dikonfigurasi per gateway dari panel admin dan disimpan di sisi server — tidak pernah terekspos ke storefront.
Pengujian
Tidak ada suite PHPUnit. composer test menjalankan bin/run-probes.php, yang mengumpulkan setiap file probe_*.php di dalam includes/_probes/ dan folder _probes/ milik masing-masing plugin, menjalankan tiap file sebagai subproses CLI lalu memeriksa exit code-nya.
composer test # run every probe
php plugins/<slug>/_probes/probe_*.php # run a single probe directly
php bin/run-probes.php --all # also run destructive probes (skipped by default)Pertanyaan umum
Dukungan & sumber daya
Masih mentok, atau butuh sesuatu yang tidak tercakup di halaman ini?