191 lines
8.5 KiB
Markdown
191 lines
8.5 KiB
Markdown
# Struktura Projektu shopPRO
|
|
|
|
Aktualna architektura po zakonczonej migracji na Domain-Driven Design + Dependency Injection.
|
|
|
|
## Warstwa domenowa (`autoload/Domain/`)
|
|
|
|
Kazdy modul zawiera Repository (i opcjonalnie dodatkowe klasy). Konstruktor DI z `$db` (Medoo). Metody sluza zarowno adminowi, jak i frontendowi (wspolna warstwa).
|
|
|
|
| Modul | Klasy | Uwagi |
|
|
|-------|-------|-------|
|
|
| Article | ArticleRepository | blog, aktualnosci, galerie, pliki |
|
|
| Attribute | AttributeRepository | cechy produktow + wartosci |
|
|
| Banner | BannerRepository | banery glowne + boczne, Redis cache |
|
|
| Basket | BasketCalculator | summary, count, walidacja stanow |
|
|
| Cache | CacheRepository | czyszczenie cache z poziomu admin |
|
|
| Category | CategoryRepository | drzewa kategorii, produkty w kategorii, Redis cache |
|
|
| Client | ClientRepository | CRUD, auth, adresy, zamowienia |
|
|
| Coupon | CouponRepository | kupony rabatowe, walidacja, uzycie |
|
|
| CronJob | CronJobType, CronJobRepository, CronJobProcessor | kolejka zadan cron (DB), priorytety, retry/backoff, harmonogram |
|
|
| Dashboard | DashboardRepository | statystyki admin, Redis cache |
|
|
| Dictionaries | DictionariesRepository | slowniki admin |
|
|
| Integrations | IntegrationsRepository | Apilo sync, ustawienia |
|
|
| Languages | LanguagesRepository | jezyki, tlumaczenia |
|
|
| Layouts | LayoutsRepository | layouty stron, 3-level fallback |
|
|
| Newsletter | NewsletterRepository, NewsletterPreviewRenderer | subskrypcje, szablony, kolejka wysylki |
|
|
| Order | OrderRepository, OrderAdminService | CRUD, Apilo sync, webhooki platnosci, kolejka retry |
|
|
| Pages | PagesRepository | strony, menu, drzewa stron |
|
|
| PaymentMethod | PaymentMethodRepository | metody platnosci, mapowanie Apilo |
|
|
| Producer | ProducerRepository | producenci |
|
|
| Product | ProductRepository | CRUD, cache, kombinacje, zdjecia, Google Feed XML |
|
|
| ProductSet | ProductSetRepository | zestawy produktow |
|
|
| Promotion | PromotionRepository | promocje, 5 typow applyType*, silnik dopasowania |
|
|
| Scontainers | ScontainersRepository | kontenery sidebaru |
|
|
| Settings | SettingsRepository | ustawienia sklepu |
|
|
| ShopStatus | ShopStatusRepository | statusy zamowien, mapowanie Apilo |
|
|
| Transport | TransportRepository | transport, koszty, powiazanie z platnosci |
|
|
| Update | UpdateRepository | aktualizacje, migracje SQL |
|
|
| User | UserRepository | uzytkownicy admin, 2FA, logowanie |
|
|
|
|
## Warstwa admin (`autoload/admin/`)
|
|
|
|
### Router: `admin\App`
|
|
- `getControllerFactories()` — mapa kontrolerow z DI wiring
|
|
- Brak fallbacku na legacy — wszystkie moduly na nowych kontrolerach
|
|
|
|
### Kontrolery (`admin\Controllers\`) — 28 kontrolerow
|
|
ArticlesArchive, Articles, Banner, Dashboard, Dictionaries, Filemanager, Integrations, Languages, Layouts, Newsletter, Pages, ProductArchive, Scontainers, Settings, ShopAttribute, ShopCategory, ShopClients, ShopCoupon, ShopOrder, ShopPaymentMethod, ShopProducer, ShopProduct, ShopProductSets, ShopPromotion, ShopStatuses, ShopTransport, Update, Users
|
|
|
|
### Support
|
|
- `admin\Support\TableListRequestFactory` — paginacja/sortowanie tabel
|
|
- `admin\Support\Forms\FormRequestHandler` — obsluga formularzy (persist przy bledach)
|
|
- `admin\Support\Forms\FormFieldRenderer` — renderowanie pol formularzy
|
|
|
|
### ViewModels
|
|
- `admin\ViewModels\Forms\` — FormEditViewModel, FormField, FormTab, FormAction, FormFieldType
|
|
- `admin\ViewModels\Common\PaginatedTableViewModel`
|
|
|
|
### Walidacja
|
|
- `admin\Validation\FormValidator` — reguly per pole, sekcje jezykowe
|
|
|
|
## Warstwa frontend (`autoload/front/`)
|
|
|
|
### Router: `front\App`
|
|
- `route()`, `checkUrlParams()`, `getControllerFactories()`
|
|
|
|
### Layout Engine: `front\LayoutEngine`
|
|
- `show()` — zamiana tagow szablonowych (kategorie, produkty, menu, banery, artykuly, kontenery, meta)
|
|
- `contact()`, `cookieInformation()`
|
|
|
|
### Kontrolery (`front\Controllers\`) — 8 kontrolerow
|
|
Newsletter, Search, ShopBasket, ShopClient, ShopCoupon, ShopOrder, ShopProducer, ShopProduct
|
|
|
|
### Widoki (`front\Views\`) — 11 klas statycznych
|
|
Articles, Banners, Languages, Menu, Newsletter, Scontainers, ShopCategory, ShopClient, ShopPaymentMethod, ShopProduct, ShopSearch
|
|
|
|
## Warstwa API (`autoload/api/`)
|
|
|
|
REST API dla ordersPRO. Entry point: `api.php`. Stateless (bez sesji), autentykacja przez `X-Api-Key` header.
|
|
|
|
### Router: `api\ApiRouter`
|
|
- `handle()` — autentykacja → routing → dispatch
|
|
- Helpery statyczne: `sendSuccess()`, `sendError()`, `getJsonBody()`, `requireMethod()`
|
|
|
|
### Kontrolery (`api\Controllers\`)
|
|
- `OrdersApiController` — lista, szczegoly, zmiana statusu, platnosc (5 akcji)
|
|
- `ProductsApiController` — lista, szczegoly, tworzenie, aktualizacja produktow (4 akcje)
|
|
- `DictionariesApiController` — statusy, transporty, metody platnosci (3 akcje)
|
|
- `CategoriesApiController` — lista aktywnych kategorii (1 akcja)
|
|
|
|
Dokumentacja: `docs/API.md`
|
|
|
|
## Warstwa wspoldzielona (`autoload/Shared/`)
|
|
|
|
| Klasa | Opis |
|
|
|-------|------|
|
|
| `Shared\Cache\CacheHandler` | Redis cache: get/set/delete/deletePattern |
|
|
| `Shared\Cache\RedisConnection` | Singleton polaczenia Redis |
|
|
| `Shared\Email\Email` | Wrapper PHPMailer |
|
|
| `Shared\Helpers\Helpers` | SEO, email, cache clearing, shortPrice, utility |
|
|
| `Shared\Html\Html` | Helpery HTML |
|
|
| `Shared\Image\ImageManipulator` | Obrobka obrazow GD |
|
|
| `Shared\Tpl\Tpl` | Silnik szablonow: render(), set() |
|
|
|
|
## Cache Redis
|
|
|
|
### Klucze
|
|
```
|
|
shop\product:{id}:{lang}:{permutation_hash} — dane produktu (TTL 24h)
|
|
ProductRepository::getProductPermutationQuantityOptions:v2:{id}:{perm} — ilosc + komunikaty
|
|
ProductRepository::productSetsWhenAddToBasket:{id} — zestawy "kupowane razem"
|
|
```
|
|
|
|
### Konwencje
|
|
- TTL domyslnie 86400 (24h)
|
|
- Dane serializowane — `unserialize()` po `get()`
|
|
- Czyszczenie: `CacheHandler::deletePattern("shop\\product:{$id}:*")`
|
|
- Czyszczenie z poziomu admin: `Shared\Helpers\Helpers::clear_product_cache($id)`
|
|
- Przycisk "Wyczysc cache" w admin: `SettingsController::clearCacheAjax()` → `flushAll()` Redis + `temp/` + `thumbs/`
|
|
|
|
## Entry pointy
|
|
|
|
| Plik | Rola |
|
|
|------|------|
|
|
| `index.php` | Frontend — autoload, sesja, DB, routing (`front\App`), layout (`front\LayoutEngine`), DOM post-processing |
|
|
| `ajax.php` | Frontend AJAX — koszyk, transport, kontakt |
|
|
| `api.php` | REST API (ordersPRO + Ekomi CSV) — router: `\api\ApiRouter`, kontrolery: `\api\Controllers\` |
|
|
| `admin/index.php` | Admin — autoload, sesja, DB, routing (`admin\App`) |
|
|
| `admin/ajax.php` | Admin AJAX |
|
|
| `cron.php` | CRON: Apilo sync (ceny/stany co 10min, cennik co 1h, retry queue) |
|
|
| `cron-turstmate.php` | TrustMate integracja |
|
|
| `cron/cron-xml.php` | Google Feed XML |
|
|
| `download.php` | Pobieranie plikow |
|
|
|
|
### Autoloader
|
|
Kazdy entry point rejestruje `__autoload_my_classes()`:
|
|
1. Probuje `autoload/{namespace}/class.{ClassName}.php` (legacy format)
|
|
2. Probuje `autoload/{namespace}/{ClassName}.php` (PSR-4 format)
|
|
|
|
### Routing frontend (index.php)
|
|
Przed `front\App::route()`:
|
|
1. Sprawdza tabele `pp_redirects` → 301 redirect
|
|
2. Sprawdza tabele `pp_routes` → regex pattern → destination
|
|
|
|
### Newsletter queue
|
|
`index.php` wywoluje `$newsletterRepo->sendQueued()` na koncu kazdego requestu frontendowego (limit 1 mail/request).
|
|
|
|
## Integracje zewnetrzne
|
|
|
|
### Apilo (cron.php)
|
|
- Synchronizacja cen/stanow produktow (co 10 min)
|
|
- Synchronizacja cennika (co 1h)
|
|
- Kolejka retry: `temp/apilo-sync-queue.json` — `OrderAdminService::processApiloSyncQueue()`
|
|
- Mapowanie statusow i platnosci przez tabele `pp_shop_statuses` i `pp_shop_payment_methods`
|
|
|
|
### Webhooki platnosci (front\Controllers\ShopOrderController)
|
|
- tPay, Przelewy24, Hotpay — ujednolicone: `set_as_paid` + `update_status`
|
|
|
|
## Biblioteki (`libraries/`)
|
|
|
|
- `medoo/medoo.php` — Medoo ORM (`$mdb`)
|
|
- `rb.php` — RedBeanPHP ORM (`\R::`, `$pdo`)
|
|
- `phpmailer/` — PHPMailer
|
|
|
|
## Wzorce architektoniczne
|
|
|
|
### DI zamiast global
|
|
```php
|
|
// Kontroler wiring (w admin\App lub front\App)
|
|
$repo = new \Domain\Example\ExampleRepository($mdb);
|
|
$controller = new \admin\Controllers\ExampleController($repo);
|
|
```
|
|
|
|
### Wspolna warstwa Domain
|
|
Metody frontendowe (z Redis cache) dodawane do istniejacych repozytoriow — NIE tworzymy osobnych FrontendService/AdminService.
|
|
|
|
### Klasy View — statyczne, bezstanowe
|
|
`front\Views\*` — nie wymagaja DI. Czyste funkcje: dane wchodza, HTML wychodzi.
|
|
|
|
### Kontrolery — instancyjne z DI
|
|
`Controllers\*` — repozytoria wstrzykiwane przez konstruktor.
|
|
|
|
### Nazewnictwo plikow
|
|
- Nowe: `ClassName.php`
|
|
- Legacy (pozostalosci): `class.ClassName.php`
|
|
- Autoloader obsluguje oba formaty
|
|
|
|
### Nazewnictwo katalogow
|
|
- Nowe: z duzej litery (`Views/`, `Controllers/`)
|
|
- Namespace `\admin\` z malej (bo katalog `admin/` jest z malej na serwerze Linux)
|
|
- NIE uzywac `\Admin\` (duze A)
|