PrizeX আসলে কী
PrizeX একটি PHP-ভিত্তিক প্রাইজ, গেমিং ও মার্কেটপ্লেস প্ল্যাটফর্ম: অকশন, লটারি, মিস্ট্রি বক্স, একটি আর্কেড গেম ক্লাস্টার, মাল্টিভেন্ডর ই-কমার্স শপ আর ওয়ালেট/কয়েন অর্থনীতি — সবই একটিমাত্র সেলফ-হোস্টেড অ্যাপ্লিকেশনে। এটি আসে একটি প্লাগইন/থিম আর্কিটেকচার, একটি অ্যাডমিন প্যানেল আর 38টি পেমেন্ট গেটওয়ে প্লাগইন নিয়ে, যেগুলো কার্ড, ওয়ালেট, ক্রিপ্টো আর আঞ্চলিক প্রসেসর কভার করে; সাথে কার্নেল থেকেই বসানো 3টি ম্যানুয়াল পেমেন্ট পদ্ধতিও থাকে।
কোনো SaaS লক-ইন নেই: আপনি নিজের হোস্টিংয়ে এটি ইনস্টল করেন, ডাটাবেসের মালিক আপনি নিজেই, আর লাইসেন্সের সাথে আজীবন আপডেট পান। প্রতিটি ভার্টিক্যাল (অকশন, লটারি, মিস্ট্রি বক্স, গেম, শপ) অ্যাডমিন প্যানেল থেকে আলাদা আলাদাভাবে চালু বা বন্ধ করা যায় — একটি নতুন ইনস্টল শুধু একটি ভার্টিক্যালের পণ্য হিসেবেও চলতে পারে, আবার পুরো স্যুট হিসেবেও।
মূল কোড কখনোই কোনো প্লাগইনের উপর কঠোরভাবে নির্ভর করে না। প্রতিটি ভার্টিক্যাল, পেমেন্ট গেটওয়ে আর সোশ্যাল লগইন হলো plugins/-এর অধীনে একেকটি প্লাগইন, যেগুলোকে সাইটের বাকি অংশ না ভেঙেই অ্যাক্টিভেট, ডিঅ্যাক্টিভেট বা ডিলিট করা যায়।
টেবিল প্রিফিক্স tbl_, কোনো ORM নেই, বেশিরভাগই প্রিপেয়ার্ড স্টেটমেন্ট। প্রতিটি প্লাগইন একটি আইডেমপোটেন্ট db_delta() ইনস্টলারের মাধ্যমে নিজের টেবিলগুলোর মালিকানা রাখে আর সেগুলোর মাইগ্রেশন নিজেই সামলায়।
কীসের উপর চলে
PrizeX সাধারণ শেয়ার্ড হোস্টিং বা VPS-এ চলে — রিরাইট-সক্ষম একটি ওয়েব সার্ভার ছাড়া বিশেষ কোনো সার্ভার কনফিগারেশন লাগে না।
* database/migrations/-এর বেশ কয়েকটি ফাইলে শুধু MariaDB-তেই থাকা ADD COLUMN IF NOT EXISTS এক্সটেনশনটি ব্যবহার করা হয়েছে। সাধারণ MySQL 8.0/8.4 সেটি নেয় না — ডাটাবেসের জন্য ডেভেলপমেন্ট আর প্রোডাকশন দুই জায়গাতেই MariaDB ব্যবহার করুন।
নতুন ইনস্টল চালু করা
নতুন সেটআপের জন্য কোনো ইনস্টল উইজার্ড নেই — আপনি সরাসরি স্কিমা ইমপোর্ট করে এনভায়রনমেন্ট ফাইলটি কনফিগার করে নেন।
- PHP ডিপেনডেন্সি ইনস্টল করুন:
composer install - এনভায়রনমেন্ট টেমপ্লেটটি কপি করে আপনার ডাটাবেস ক্রেডেনশিয়াল বসান:
cp .env.example .env - আপনার
.env-এ যে ডাটাবেসের নাম দেওয়া আছে, তাতেdatabase/production.sqlইমপোর্ট করুন — এতেই পুরো স্কিমা তৈরি হয়ে যায়। - সাথে আসা অ্যাডমিন অ্যাকাউন্টটি বদলে ফেলুন (নিচের নোটটি দেখুন), তারপর
/admin/-এ লগ ইন করুন।
database/production.sql-এর সাথে একটি tbl_admin রো আসে (admin@wowcodes.in), যার পাসওয়ার্ড হ্যাশ প্রতিটি ইনস্টলেই হুবহু এক। লাইভে যাওয়ার আগে সেটি মুছে নিজেরটি বসিয়ে নিন:
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);লোকাল ডেভেলপমেন্টের জন্য Apache ছাড়াই PHP-র বিল্ট-ইন সার্ভার কাজ করে: php -S localhost:8000 router.php — তবে মনে রাখবেন, এই সার্ভার .htaccess পুরোপুরি উপেক্ষা করে, তাই router.php-এ একই রাউটিং নিয়মগুলো হাতে করে আবার বসানো আছে (দেখুন ওয়েব সার্ভার সেটআপ)।
এনভায়রনমেন্ট ভেরিয়েবল
এনভায়রনমেন্ট-নির্দিষ্ট সব সেটিংস থাকে .env-এ, যা vlucas/phpdotenv দিয়ে লোড হয়। .env.example কপি করে .env বানান (এটি git-ignored) আর প্রতিটি এনভায়রনমেন্টের জন্য আসল মানগুলো বসান — অন্তত ডাটাবেস ক্রেডেনশিয়াল, স্কিমা ইমপোর্টের আগেই।
যেসব সাইট-ওয়াইড সেটিংস এনভায়রনমেন্ট-নির্দিষ্ট নয় (অ্যাপের নাম, মুদ্রা, সক্রিয় প্লাগইন, সক্রিয় থিম আর ভার্টিক্যাল অনুযায়ী টগল) সেগুলো ফাইলে নয়, ডাটাবেসের tbl_settings-এ থাকে আর অ্যাডমিন প্যানেল থেকেই সামলানো হয়।
ওয়েব সার্ভার সেটআপ
রাউটিং ও সিকিউরিটির নিয়মগুলো — সুন্দর URL, .env/connection.php/লগ ফাইলে সরাসরি অ্যাক্সেস বন্ধ করা, আর আপলোড করা কনটেন্টকে PHP হিসেবে চলতে না দেওয়া — প্রজেক্ট জুড়ে ছড়িয়ে থাকা .htaccess ফাইলগুলোতে সংজ্ঞায়িত আছে। Apache আর LiteSpeed/OpenLiteSpeed এগুলো নিজে থেকেই পড়ে নেয়।
nginx-এ nginx.conf.example ব্যবহার করুন, যেখানে ওই প্রতিটি নিয়মই একটি nginx server{} ব্লক হিসেবে হুবহু ধরা আছে — আপনার এনভায়রনমেন্ট অনুযায়ী server_name, root আর PHP-FPM সকেটটি ঠিক করে নিন।
.htaccess (প্রোডাকশন), router.php (লোকাল php -S ডেভ সার্ভার) আর nginx.conf.example (nginx) — তিনটিই একই রাউটিং নিয়ম আলাদা আলাদাভাবে আবার লিখে রেখেছে। নতুন কোনো সুন্দর-URL রুট যোগ করা মানে তিনটিতেই আপডেট করা।
রিকোয়েস্ট আর্কিটেকচার
প্রতিটি স্টোরফ্রন্ট পেজ (index.php, item.php, …) includes/header.php-এর মধ্য দিয়ে বুট হয়, ঠিক এই ক্রমে:
connection.php সেশন শুরু করে, .env-এর ক্রেডেনশিয়াল দিয়ে mysqli-র মাধ্যমে সংযোগ করে, tbl_settings-কে APP_NAME আর CURRENCY-র মতো কনস্ট্যান্টে লোড করে, আর বর্তমান ব্যবহারকারীকে একটি ডিভাইস-ফিঙ্গারপ্রিন্ট রো-সহ লগ ইন করায়। plugins_load() প্রতিটি সক্রিয় প্লাগইন বুট করে plugins_loaded হুকটি চালায় — এই বিন্দুতে এসেই সক্রিয় ভার্টিক্যালগুলোর আসল, বর্তমান তালিকাটি জানা যায়, আর সেজন্যই header.php এর পরে লিগ্যাসি সেটিংস ফ্ল্যাগগুলো (shop, multivendor, auction, lottery) প্লাগইনের প্রকৃত সক্রিয় অবস্থার সাথে আবার মিলিয়ে দেখে।
অ্যাডমিন প্যানেল এই বুটস্ট্র্যাপটি আলাদা করে আবার করে না — admin/includes/connection.php অ্যাডমিন-নির্দিষ্ট সেশন/এরর কনফিগ ঠিক করে, তারপর মূল includes/connection.php-কেই ইনক্লুড করে।
প্লাগইন সিস্টেম
একটি প্লাগইন হলো plugins/<slug>/plugin.php — হেডার-কমেন্টে রাখা মেটাডেটা, যা ফাইলটি না চালিয়েই পড়া হয় — সাথে সমৃদ্ধ ক্যাটালগ তথ্যের জন্য ঐচ্ছিক একটি plugin.json। সক্রিয় প্লাগইনগুলো tbl_settings.active_plugins-এ একটি JSON অ্যারে হিসেবে জমা থাকে।
- টেবিলের মালিকানা — প্রতিটি প্লাগইন নিজের
includes/schema.phpসংজ্ঞায়িত করে, যা অ্যাক্টিভেশনের সময় ডাকা হয় আর একটি আইডেমপোটেন্টdb_delta()হেলপার ব্যবহার করে (CREATE TABLE IF NOT EXISTS+ শুধু-যোগ-করাALTER TABLE ADD COLUMN)। কোনো প্লাগইন অন্য প্লাগইনের টেবিলে কখনোই হাত দেয় না। - রেজিস্ট্রি আগে লোড হয় —
add_admin_page,add_route,add_cron_job,add_api_routeআরregister_moduleসবই কোনো প্লাগইন লোড হওয়ার আগেই সংজ্ঞায়িত হয়ে যায়, তাই প্লাগইনটি শেষ পর্যন্ত নিষ্ক্রিয় থাকলেও তার টপ-লেভেল কলগুলো কখনও ফ্যাটাল এরর ঘটায় না। - পরিচ্ছন্নভাবে মুছে ফেলা — কোনো প্লাগইন ডিলিট করলে তার
uninstall.phpচলে আর ফোল্ডারটি সরে যায়;plugins/<slug>/-এর বাইরের কোনো কিছুরই তার ফাইলের উপর কঠোর নির্ভরতা থাকা উচিত নয়, ফলে প্লাগইনটি চলে গেলেও সাইটের বাকি অংশ চলতেই থাকে।
থিম সিস্টেম
একটি থিম থাকে assets/themes/<slug>/-এ — একটি manifest.php, theme.css, থিম হুকের জন্য functions.php আর ঐচ্ছিক একটি components/। সক্রিয় থিমটি tbl_settings.active_theme-এ জমা থাকে, আর কিছুই সেট করা না থাকলে editorial ফলব্যাক হিসেবে কাজ করে।
কম্পোনেন্ট খোঁজা হয় এই ক্রমে: প্রথমে সক্রিয় থিমের নিজের components/ ফোল্ডার, তারপর কোনো প্লাগইনের register_module()-এ ঘোষিত কম্পোনেন্ট ডিরেক্টরি, তারপর শেয়ার করা রুট components/। বাস্তবে এর মানে হলো, শেয়ার করা ডিফল্টটি components/-এ একবারই থাকে, আর যেকোনো থিম — কিংবা সক্রিয় কোনো ভার্টিক্যাল প্লাগইন — নিজের কপি দিয়ে নির্দিষ্ট একটি কম্পোনেন্ট পাথ ওভাররাইড করতে পারে।
ডাটাবেস
টেবিল প্রিফিক্স tbl_, সরাসরি mysqli, বেশিরভাগই প্রিপেয়ার্ড স্টেটমেন্ট। SQL ফাইলগুলো, কর্তৃত্বের ক্রম অনুযায়ী:
database/core-schema.sql— হাতে রক্ষণাবেক্ষণ করা, শুধু কার্নেলের টেবিল; ভার্টিক্যাল/প্লাগইনের টেবিল ইচ্ছাকৃতভাবেই বাদ রাখা হয়েছে।database/production.sql— জেনারেট করা (কোর স্কিমা + প্রতিটি প্লাগইনের নিজস্ব ইনস্টল রুটিন, একটি স্ক্র্যাচ ডাটাবেস থেকে ডাম্প করা)। নতুন ইনস্টলের জন্য আপনি এটিই ইমপোর্ট করবেন।database/sandbox.sql— লোকাল ডেভেলপমেন্টের জন্য ডেমো/সিড ডেটাসেট।database/migration.sql— চালু থাকা ইনস্টলের জন্য একত্রিত, আইডেমপোটেন্ট আপগ্রেড স্ক্রিপ্ট।database/migrations/<slug>/up.sql(+ যেখানে ফিরিয়ে আনা সম্ভব সেখানেdown.sql) — প্রতিটি আলাদা মাইগ্রেশনের জন্য একটি করে ফাইল।
মডিউল
প্রতিটি মডিউল একই ইনস্টলেশনের সাথেই আসে আর অ্যাডমিন প্যানেল থেকে আলাদাভাবে চালু-বন্ধ করা যায়।
অকশন
মাল্টিভেন্ডর সেলার পোর্টাল আর কমিশন ইঞ্জিনসহ লাইভ বিডিং। কোর প্লাগইন: plugins/auction।
লটারি
নিজের মতো সাজানো সময়সূচি, পুরস্কার আর বিজয়ীকে জানানোর ব্যবস্থাসহ টিকিটভিত্তিক ড্র। কোর প্লাগইন: plugins/lottery।
মিস্ট্রি বক্স
রিভিল অ্যানিমেশনসহ নিজের মতো সাজানো প্রাইজ পুল — ব্যবহারকারী একটি বক্স কিনে সাথে সাথেই দেখতে পান কী জিতলেন। প্লাগইন: plugins/mystery-box।
গেম ও রিওয়ার্ড
games/-এর অধীনে একটি আর্কেড ক্লাস্টার, সাথে এনগেজমেন্ট/আয়ের প্লাগইন:
শপ ও মার্কেটপ্লেস
প্রোমোশন আর মার্চেন্ডাইজিং টুলসহ একটি মাল্টিভেন্ডর ই-কমার্স স্তর। কোর প্লাগইন: plugins/shop, plugins/multivendor।
ওয়ালেট, কয়েন ও ইনভেস্টিং
সব মডিউল জুড়ে ভাগ করা একটিমাত্র প্ল্যাটফর্ম-ওয়াইড ওয়ালেট।
রেফারেল ও রিওয়ার্ড
অথেনটিকেশন, ট্রাস্ট ও কমপ্লায়েন্স
ইউটিলিটি
অ্যাডমিন প্যানেল
অ্যাডমিন প্যানেল থাকে admin/-এর অধীনে, আর এটি স্টোরফ্রন্টের বুটস্ট্র্যাপ আলাদা করে আবার করে না — এটি অ্যাডমিন-নির্দিষ্ট সেশন/এরর কনফিগ ঠিক করে, তারপর মূল includes/connection.php-কেই ইনক্লুড করে। পেজগুলো রেজিস্টার হয় add_admin_page()-এর মাধ্যমে, যা সাইডবারের এন্ট্রি, ক্যাপাবিলিটি গেটিং, CSRF আর অথেনটিকেশনের কাঠামো সামলায়; শুধু-অ্যাডমিন JSON অ্যাকশনগুলো add_admin_ajax()-এর মাধ্যমে রেজিস্টার হয়ে admin/ajax.php?action=<slug> দিয়ে ডিসপ্যাচ হয়।
আইটেম, ব্যানার, পেজ, মেনু, ব্লগ।
স্বয়ংক্রিয় ও ম্যানুয়াল গেটওয়ে ব্যবস্থাপনা, ম্যানুয়াল পেমেন্ট রিভিউ, পেআউট এক্সপোর্ট।
ইউজার গ্রুপ, রোল, সেলারের তথ্য, ইম্পারসোনেশন।
লেনদেন/অর্ডার/ব্যবহারকারীর এক্সপোর্ট, ক্রন লগ, এরর ট্র্যাকিং, অ্যাডমিন অ্যাক্টিভিটি লগ।
ইমেইল ক্যাম্পেইন, টেমপ্লেট, নিউজলেটার, পুশ নোটিফিকেশন, নোটিফিকেশন লগ।
প্লাগইন ও থিম চালু/বন্ধ করা, পেজ অনুযায়ী SEO সেটিংস, সাইট-ওয়াইড সেটিংস।
স্টোরফ্রন্ট থিম
assets/themes/-এর অধীনে পাঁচটি থিম আসে, প্রতিটি ইনস্টলে অ্যাডমিন প্যানেল থেকেই বদলে নেওয়া যায়। প্রতিটি থিম শেয়ার করা কম্পোনেন্টগুলোর নিজস্ব কপি নিজের components/ ফোল্ডারেই রাখে।
সাদা কার্ড আর নরম ছায়াসহ সহজ, আধুনিক একটি চেহারা — প্রায় যেকোনো ধরনের দোকানের জন্যই নিরাপদ ও বহুমুখী পছন্দ।
উষ্ণ কাগজি রং আর ঝকঝকে টাইপোগ্রাফিসহ পরিচ্ছন্ন, ম্যাগাজিন-ধাঁচের চেহারা — পরিপাটি ও নির্ভরযোগ্য স্টোরফ্রন্টের জন্য।
ডিফল্ট ফলব্যাক থিমসোনালি ছোঁয়াসহ সাহসী, বিলাসবহুল একটি ডার্ক থিম — উত্তেজনা আর অভিজাত ভাব আনতেই তৈরি।
চিরাচরিত বাজার থেকে অনুপ্রাণিত উষ্ণ, সমৃদ্ধভাবে সাজানো চেহারা — ডান-থেকে-বাঁয়ে ভাষার সাপোর্টসহ।
ভুতুড়ে, উৎসবমুখর মৌসুমি চেহারা — গাঢ় বেগুনি পটভূমিতে জ্বলজ্বলে কুমড়ো-কমলা হাইলাইট।
পেমেন্ট গেটওয়ে
38টি স্বয়ংক্রিয় গেটওয়ের মালিকানা প্লাগইনের হাতেই — প্রতিটি থাকে নিজের plugins/gateway-<slug>/ ফোল্ডারে আর add_payment_gateway()-এর মাধ্যমে নিজেকে কার্নেলে রেজিস্টার করে। একটি অ্যাক্টিভেট করলেই সেটি কাজ করতে শুরু করে; চেকআউট ডিসপ্যাচারে (payment_processor.php) কোনো নির্দিষ্ট গেটওয়ে হার্ডকোড করা নেই।
3টি ম্যানুয়াল পদ্ধতি কার্নেল থেকেই বসানো gateway_type = 'manual' রো, কনফিগার করার মতো কোনো init/verify কোড এদের নেই — এগুলো শুধু পেমেন্টের নির্দেশনা বা একটি QR কোড দেখায়। manual-gateway-builder প্লাগইনটি অ্যাডমিনকে কোডে হাত না দিয়েই আরও কাস্টম ম্যানুয়াল পেমেন্ট পদ্ধতি যোগ করতে দেয়।
কিছু গেটওয়ে (Stripe, Razorpay, Midtrans, Venmo) এমন চেকআউট ফ্লোর জন্য একটি render হুকও রেজিস্টার করে যেগুলোর ক্লায়েন্ট-সাইড JS দরকার হয় — একটি Stripe Checkout বুটস্ট্র্যাপ, কিংবা এমন কোনো Razorpay/Midtrans/Braintree SDK যার জন্য আগে সার্ভারে একটি অর্ডার ID বা টোকেন তৈরি করে নিতে হয়। বাকি প্রতিটি গেটওয়ে কার্নেলে বাড়তি কোনো তার না জুড়েই কাজ করে।
API ও AJAX লেয়ার
api/v1/— মোবাইল অ্যাপ আর বাইরের কনজিউমারদের জন্য JWT-অথেনটিকেটেড REST API।api/v1/middleware/*.phpAuthorization: Bearer <token>হেডারটি যাচাই করে। প্লাগইনগুলোadd_api_route()-এর মাধ্যমে নিজেদের এন্ডপয়েন্ট যোগ করে।ajax/— স্টোরফ্রন্টের নিজস্ব JS-এর (কার্ট, কুপন, নোটিফিকেশন) জন্য সেশন-কুকি-অথেনটিকেটেড অভ্যন্তরীণ AJAX। কোনো টোকেন স্তর নেই — এটিconnection.php-এর তৈরি করা PHP সেশনের উপরেই নির্ভর করে।- টপ-লেভেলে আলগা
api/— সংস্করণহীন বিবিধ এন্ডপয়েন্ট, যেমনgeo_location.php,exchange-rate.phpআরofferwall_postback.php।
মোবাইল অ্যাপ
mobile/ একটি আলাদা Capacitor + Ionic প্রজেক্ট — লাইভ সাইটের চারপাশে একটি WebView মোড়ক, আলাদা কোনো SPA নয়, আবার শুধু api/v1-এর কনজিউমারও নয়। এর capacitor.config.ts ফাইলে server.url আপনার ডোমেইনের দিকে নির্দেশ করে। এর নিজের package.json আছে আর এটি প্রজেক্টের রুট থেকে বিল্ড হয় না:
cd mobile
npm run sync
npm run open:ios
npm run open:androidআপডেট ও মাইগ্রেশন
কোনো লাইভ ডাটাবেসে database/migration.sql বা database/migrations/<slug>/up.sql চালানোর আগে একটি স্ন্যাপশট নিয়ে রাখুন:
mysqldump --single-transaction -u<user> -p<pass> <db> > pre-deploy-$(date +%Y%m%d-%H%M%S).sqlবেশিরভাগ মাইগ্রেশনের সাথেই মিলিয়ে একটি down.sql আসে, যা শুধু ওই একটি পরিবর্তনই ফিরিয়ে দেয়। যে কয়েকটি শুধু কাঠামো যোগ না করে বিদ্যমান ডেটাই বদলে দেয়, সেগুলোর সাথে আসা down.sql বরং লিখে রাখে কেন সেটি কিছুই করে না — ওগুলোর ক্ষেত্রে রোলব্যাক দরকার হলে ডিপ্লয়ের আগের ডাম্প থেকে ফিরিয়ে আনুন।
সিকিউরিটি নোট
- ইমপোর্ট করার সাথে সাথেই সাথে-আসা অ্যাডমিন ক্রেডেনশিয়াল বদলে ফেলুন (দেখুন ইনস্টলেশন)।
.env,connection.phpআর লগ ফাইলগুলোতে সরাসরি HTTP অ্যাক্সেস সাথে আসা.htaccess/ nginx নিয়মেই বন্ধ করা আছে — ওই নিয়মগুলো সরাবেন না।- আপলোড করা কনটেন্ট এমনভাবে পরিবেশন করা হয় যাতে সেটি PHP হিসেবে চলতে না পারে — আর এটি অ্যাপ্লিকেশনের স্তরে নয়, ওয়েব-সার্ভার কনফিগের স্তরেই নিশ্চিত করা হয়।
- পেমেন্ট গেটওয়ের ক্রেডেনশিয়াল প্রতিটি গেটওয়ের জন্য আলাদাভাবে অ্যাডমিন প্যানেল থেকে কনফিগার হয় আর সার্ভারেই জমা থাকে — স্টোরফ্রন্টে কখনোই সেগুলো প্রকাশ পায় না।
টেস্টিং
কোনো PHPUnit স্যুট নেই। composer test চালায় bin/run-probes.php, যা includes/_probes/ আর প্রতিটি প্লাগইনের নিজস্ব _probes/ ফোল্ডারের সব probe_*.php ফাইল একত্র করে, প্রতিটিকে আলাদা CLI সাবপ্রসেস হিসেবে চালায় আর তার এক্সিট কোড দেখে।
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)সচরাচর জিজ্ঞাসিত প্রশ্ন
সাপোর্ট ও রিসোর্স
এখনও আটকে আছেন, নাকি এই পেজে নেই এমন কিছু দরকার?