- Created new directories and index files for controls, factory, and views. - Added .htaccess files for URL rewriting in layout and images directories. - Included a logo image in the layout/images directory. - Implemented load_prices.php to load ticket prices from the database into settings. - Developed admin panel settings page for enabling ticket sales. - Created tickets management page in the admin panel to display and edit ticket prices. - Added upgrade.php for database migrations, including creating the ticket_prices table and adding weekend price column.
4.4 KiB
4.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Online ticket sales system for Kompleks Turystyczny Brzezovka (amusement park in Kolbuszowa, Poland). Handles ticket purchase, shopping cart, Przelewy24 payments, QR code generation, invoice issuing (via fakturowo.pl API), and a QR ticket scanner for staff.
Live at: bilety.brzezovka.pl
Architecture
Custom PHP MVC without a framework. No Composer — all dependencies are vendored in libraries/.
Request Flow
.htaccessrewrites URLs as/{module}/{action}/{params}→index.php?module=X&action=Y&...index.phpbootstraps: autoloader, config, DB connections (Medoo + RedBeanPHP), session\view\Site::show()→\controls\Site::route()resolvesmodule/actionto a controller method via\controls\{Module}::{action}()- Controllers return rendered HTML via
\Tpl::view('template-name', $vars)
Autoloader Convention
spl_autoload_register maps namespaced classes to files:
\controls\Tickets→autoload/controls/class.Tickets.php\factory\Tickets→autoload/factory/class.Tickets.php\view\Site→autoload/view/class.Site.php\S,\Tpl,\DbModel,\Html→autoload/class.{Name}.php
Layer Responsibilities
| Layer | Namespace/Dir | Role |
|---|---|---|
| Controllers | autoload/controls/ |
Handle actions, coordinate logic, return rendered views |
| Factory (Services) | autoload/factory/ |
Business logic, DB queries, data processing |
| Views | autoload/view/ |
Layout assembly (wraps controller output in site layout) |
| Templates | templates/ |
PHP template files rendered by Tpl::view() |
| Core classes | autoload/ (root) |
S (utility/session), Tpl (templating), DbModel (active record), Html (form helpers) |
Key Modules
| Module | Controller | Purpose |
|---|---|---|
tickets |
controls\Tickets |
Public ticket shop: browse, add/remove from cart, checkout, payment |
apanel |
controls\Apanel |
Admin panel: order list, order editing, ticket validation |
scanner |
controls\Scanner |
QR code scanner for on-site ticket verification |
users |
controls\Users |
User login/logout, settings, permissions |
Database
MySQL via two ORMs used in parallel:
- Medoo (
$mdbglobal) — primary query builder for tickets/orders - RedBeanPHP (
\R::) — used in cron jobs (CEIDG import)
Main tables: orders, order_tickets, users
Entry Points
| File | Purpose |
|---|---|
index.php |
Main app entry (web requests) |
ajax.php |
AJAX endpoint (same autoloader, Medoo only) |
api.php |
API endpoint (autoloader + Medoo + PHPMailer + RedBeanPHP) |
cron.php |
Scheduled tasks (email reminders, CEIDG import) |
External Integrations
- Przelewy24 — payment gateway (merchant config in
config.php) - fakturowo.pl — invoice/receipt generation via API
- PHPMailer — email sending (SMTP via
bilety@brzezovka.pl) - phpqrcode — QR code generation for order hashes
Frontend
- Bootstrap 5.2, jQuery 3.6, Font Awesome 6.1
- SCSS in
layout/style-scss/compiled tolayout/style-css/style.css - SCSS compile comment:
// out: ../style-css/style.css, compress: true, sourceMap: true(Live Sass Compiler) - DataTables for admin order list
- html5-qrcode for scanner
- Datepicker for ticket date selection
Key Conventions
- All controller methods are
static publicand accessed via URL routing - Global
$settings,$mdb,$userare used throughout (no DI) - Ticket config (prices, types, dynamic pricing) lives entirely in
config.php - Session-based shopping cart stored at
$_SESSION['basket'] - Admin auth is a single shared password (
$settings['admin-password']), stored in session as$_SESSION['user'] - Template rendering:
\Tpl::view('path/template-name', ['key' => $value])— variables accessible as$this->keyin templates - AJAX responses: controllers
echo json_encode(...)thenexit;
Development
- No build system, test framework, or package manager
- SCSS compilation: use VS Code "Live Sass Compiler" extension (configured via first-line comment in
style.scss) - Deployment: FTP sync (
.vscode/ftp-kr.sync.cache.jsonpresent) - PHP version: compatible with PHP 7.4+ (no typed properties, uses legacy autoload pattern)
- Timezone:
Europe/Warsaw - Language: Polish (all UI text, comments, variable names mix PL/EN)