- Implemented TransportRepository for managing transport data with methods for listing, finding, saving, and retrieving transport costs. - Created ShopTransportController to handle transport-related actions, including listing, editing, and saving transports. - Added views for transport management: transports list and transport edit forms. - Introduced JavaScript for responsive tabs in transport edit view. - Updated testing suite with comprehensive unit tests for TransportRepository and ShopTransportController. - Increased test coverage with new assertions and scenarios for transport functionalities.
275 lines
9.9 KiB
Markdown
275 lines
9.9 KiB
Markdown
# Struktura Projektu shopPRO
|
|
|
|
Dokumentacja struktury projektu shopPRO do szybkiego odniesienia.
|
|
|
|
## System Cache (Redis)
|
|
|
|
### Klasy odpowiedzialne za cache
|
|
|
|
#### RedisConnection
|
|
- **Plik:** `autoload/class.RedisConnection.php`
|
|
- **Opis:** Singleton zarządzający połączeniem z Redis
|
|
- **Metody:**
|
|
- `getInstance()` - pobiera instancję połączenia
|
|
- `getConnection()` - zwraca obiekt Redis
|
|
|
|
#### CacheHandler
|
|
- **Plik:** `autoload/class.CacheHandler.php`
|
|
- **Opis:** Handler do obsługi cache Redis
|
|
- **Metody:**
|
|
- `get($key)` - pobiera wartość z cache
|
|
- `set($key, $value, $ttl = 86400)` - zapisuje wartość do cache
|
|
- `exists($key)` - sprawdza czy klucz istnieje
|
|
- `delete($key)` - usuwa pojedynczy klucz
|
|
- `deletePattern($pattern)` - usuwa klucze według wzorca
|
|
|
|
#### Klasa S (pomocnicza)
|
|
- **Plik:** `autoload/class.S.php`
|
|
- **Metody cache:**
|
|
- `clear_redis_cache()` - czyści cały cache Redis (flushAll)
|
|
- `clear_product_cache(int $product_id)` - czyści cache konkretnego produktu
|
|
|
|
### Wzorce kluczy Redis
|
|
|
|
#### Produkty
|
|
```
|
|
shop\product:{product_id}:{lang_id}:{permutation_hash}
|
|
```
|
|
- Przechowuje zserializowany obiekt produktu
|
|
- TTL: 24 godziny (86400 sekund)
|
|
- Klasa: `shop\Product::getFromCache()` - `autoload/shop/class.Product.php:121`
|
|
|
|
#### Opcje ilościowe produktu
|
|
```
|
|
\shop\Product::get_product_permutation_quantity_options:{product_id}:{permutation}
|
|
```
|
|
- Przechowuje informacje o ilości i komunikatach magazynowych
|
|
- Klasa: `shop\Product::get_product_permutation_quantity_options()` - `autoload/shop/class.Product.php:549`
|
|
|
|
#### Zestawy produktów
|
|
```
|
|
\shop\Product::product_sets_when_add_to_basket:{product_id}
|
|
```
|
|
- Przechowuje produkty często kupowane razem
|
|
- Klasa: `shop\Product::product_sets_when_add_to_basket()` - `autoload/shop/class.Product.php:316`
|
|
|
|
## Integracje z systemami zewnętrznymi (CRON)
|
|
|
|
### Plik: `cron.php`
|
|
|
|
#### Apilo
|
|
- **Aktualizacja pojedynczego produktu:** synchronizacja cen i stanow
|
|
- Czestotliwosc: Co 10 minut
|
|
- **Synchronizacja cennika:** masowa aktualizacja cen z Apilo
|
|
- Czestotliwosc: Co 1 godzine
|
|
|
|
**Uwaga:** Integracje Sellasist i Baselinker zostaly usuniete w ver. 0.263.
|
|
|
|
## Panel Administratora
|
|
|
|
### Routing
|
|
- Główny katalog: `admin/`
|
|
- Template główny: `admin/templates/site/main-layout.php`
|
|
- Kontrolery (nowe): `autoload/admin/Controllers/`
|
|
- Kontrolery legacy (fallback): `autoload/admin/controls/`
|
|
|
|
### Przycisk "Wyczyść cache"
|
|
- **Lokalizacja UI:** `admin/templates/site/main-layout.php:172`
|
|
- **JavaScript:** `admin/templates/site/main-layout.php:235-274`
|
|
- **Endpoint AJAX:** `/admin/settings/clear_cache_ajax/`
|
|
- **Kontroler:** `autoload/admin/Controllers/SettingsController.php:43-60`
|
|
- **Działanie:**
|
|
1. Pokazuje spinner "Czyszczę cache..."
|
|
2. Czyści katalogi: `temp/`, `thumbs/`
|
|
3. Wykonuje `flushAll()` na Redis
|
|
4. Pokazuje "Cache wyczyszczony!" przez 2 sekundy
|
|
5. Przywraca stan początkowy
|
|
|
|
## Struktura katalogów
|
|
|
|
```
|
|
shopPRO/
|
|
├── admin/ # Panel administratora
|
|
│ ├── templates/ # Szablony widoków
|
|
│ └── layout/ # Zasoby CSS/JS/ikony
|
|
├── autoload/ # Klasy autoloadowane
|
|
│ ├── admin/ # Klasy panelu admin
|
|
│ │ ├── Controllers/ # Nowe kontrolery DI
|
|
│ │ ├── controls/ # Kontrolery legacy (fallback)
|
|
│ │ └── factory/ # Fabryki/helpery
|
|
│ ├── Domain/ # Repozytoria/logika domenowa
|
|
│ ├── front/ # Klasy frontendu
|
|
│ │ └── factory/ # Fabryki/helpery
|
|
│ └── shop/ # Klasy sklepu
|
|
├── docs/ # Dokumentacja techniczna
|
|
├── libraries/ # Biblioteki zewnętrzne
|
|
├── temp/ # Cache tymczasowy
|
|
├── thumbs/ # Miniatury zdjęć
|
|
└── cron.php # Zadania CRON
|
|
```
|
|
|
|
## Baza danych
|
|
|
|
### Główne tabele produktów
|
|
- `pp_shop_products` - produkty główne
|
|
- `pp_shop_products_langs` - tłumaczenia produktów
|
|
- `pp_shop_products_images` - zdjęcia produktów
|
|
- `pp_shop_products_categories` - kategorie produktów
|
|
- `pp_shop_products_custom_fields` - pola własne produktów
|
|
|
|
### Tabele integracji
|
|
- Kolumny w `pp_shop_products`:
|
|
- `apilo_product_id`, `apilo_product_name`, `apilo_get_data_date`
|
|
- Tabele ustawien:
|
|
- `pp_shop_apilo_settings` (key-value)
|
|
- `pp_shop_shoppro_settings` (key-value)
|
|
|
|
### Tabele checkout
|
|
- `pp_shop_payment_methods` - metody platnosci sklepu (mapowanie `apilo_payment_type_id`)
|
|
- `pp_shop_transports` - rodzaje transportu sklepu (mapowanie `apilo_carrier_account_id`)
|
|
- `pp_shop_transport_payment_methods` - powiazanie metod transportu i platnosci
|
|
|
|
Pelna dokumentacja tabel: `DATABASE_STRUCTURE.md`
|
|
|
|
## Konfiguracja
|
|
|
|
### Redis
|
|
- Konfiguracja: `config.php` (zmienna `$config['redis']`)
|
|
- Parametry: host, port, password
|
|
|
|
### Autoload
|
|
- Funkcja: `__autoload_my_classes()` w `cron.php:6`
|
|
- Wzorzec: `autoload/{namespace}/class.{ClassName}.php`
|
|
|
|
## Klasy pomocnicze
|
|
|
|
### \S (autoload/class.S.php)
|
|
Główna klasa helper z metodami:
|
|
- `seo($val)` - generowanie URL SEO
|
|
- `normalize_decimal($val, $precision)` - normalizacja liczb
|
|
- `send_email()` - wysyłanie emaili
|
|
- `delete_dir($dir)` - usuwanie katalogów
|
|
- `htacces()` - generowanie .htaccess i sitemap.xml
|
|
|
|
### Medoo
|
|
- Plik: `libraries/medoo/medoo.php`
|
|
- Zmienna: `$mdb`
|
|
- ORM do operacji na bazie danych
|
|
|
|
## Najważniejsze wzorce
|
|
|
|
### Namespace'y
|
|
- `\admin\Controllers\` - nowe kontrolery panelu admin (DI)
|
|
- `\admin\controls\` - kontrolery legacy (fallback)
|
|
- `\Domain\` - repozytoria/logika domenowa
|
|
- `\admin\factory\` - helpery/fabryki admin
|
|
- `\front\factory\` - helpery/fabryki frontend
|
|
- `\shop\` - klasy sklepu (Product, Order, itp.)
|
|
|
|
### Cachowanie produktów
|
|
```php
|
|
// Pobranie produktu z cache
|
|
$product = \shop\Product::getFromCache($product_id, $lang_id, $permutation_hash);
|
|
|
|
// Czyszczenie cache produktu
|
|
\S::clear_product_cache($product_id);
|
|
|
|
// Czyszczenie całego cache
|
|
\S::clear_redis_cache();
|
|
```
|
|
|
|
## Refaktoryzacja do Domain-Driven Architecture
|
|
|
|
### Nowa struktura (w trakcie migracji)
|
|
```
|
|
autoload/
|
|
├── Domain/ # Nowa warstwa biznesowa (namespace \Domain\)
|
|
│ ├── Product/
|
|
│ │ └── ProductRepository.php
|
|
│ ├── Banner/
|
|
│ │ └── BannerRepository.php
|
|
│ ├── Settings/
|
|
│ │ └── SettingsRepository.php
|
|
│ ├── Cache/
|
|
│ │ └── CacheRepository.php
|
|
│ ├── Article/
|
|
│ │ └── ArticleRepository.php
|
|
│ ├── User/
|
|
│ │ └── UserRepository.php
|
|
│ ├── Languages/
|
|
│ │ └── LanguagesRepository.php
|
|
│ ├── Layouts/
|
|
│ │ └── LayoutsRepository.php
|
|
│ ├── Newsletter/
|
|
│ │ └── NewsletterRepository.php
|
|
│ ├── Scontainers/
|
|
│ │ └── ScontainersRepository.php
|
|
│ ├── Dictionaries/
|
|
│ │ └── DictionariesRepository.php
|
|
│ ├── Pages/
|
|
│ │ └── PagesRepository.php
|
|
│ ├── Integrations/
|
|
│ │ └── IntegrationsRepository.php
|
|
│ ├── Promotion/
|
|
│ │ └── PromotionRepository.php
|
|
│ ├── Coupon/
|
|
│ │ └── CouponRepository.php
|
|
│ ├── ShopStatus/
|
|
│ │ └── ShopStatusRepository.php
|
|
│ ├── Transport/
|
|
│ │ └── TransportRepository.php
|
|
│ └── ...
|
|
├── admin/
|
|
│ ├── Controllers/ # Nowe kontrolery (namespace \admin\Controllers\)
|
|
│ ├── class.Site.php # Router: nowy kontroler → fallback stary
|
|
│ ├── controls/ # Stare kontrolery (niezależny fallback)
|
|
│ ├── factory/ # Stare helpery (niezależny fallback)
|
|
│ └── view/ # Widoki (statyczne - bez zmian)
|
|
├── shop/ # Legacy - fasady do Domain
|
|
└── front/factory/ # Legacy - stopniowo migrowane
|
|
```
|
|
|
|
**Aktualizacja 2026-02-14 (ver. 0.268):**
|
|
- Dodano modul domenowy `Domain/PaymentMethod/PaymentMethodRepository.php`.
|
|
- Dodano kontroler DI `admin/Controllers/ShopPaymentMethodController.php`.
|
|
- Modul `/admin/shop_payment_method/*` dziala na nowych widokach (`payment-methods-list`, `payment-method-edit`).
|
|
- Usunieto legacy: `autoload/admin/controls/class.ShopPaymentMethod.php`, `autoload/admin/factory/class.ShopPaymentMethod.php`, `autoload/admin/view/class.ShopPaymentMethod.php`, `admin/templates/shop-payment-method/view-list.php`.
|
|
|
|
**Aktualizacja 2026-02-14 (ver. 0.269):**
|
|
- Dodano modul domenowy `Domain/Transport/TransportRepository.php`.
|
|
- Dodano kontroler DI `admin/Controllers/ShopTransportController.php`.
|
|
- Modul `/admin/shop_transport/*` dziala na nowych widokach (`transports-list`, `transport-edit`).
|
|
- Usunieto legacy: `autoload/admin/controls/class.ShopTransport.php`, `autoload/admin/view/class.ShopTransport.php`, `admin/templates/shop-transport/view-list.php`.
|
|
- `admin\factory\ShopTransport` i `front\factory\ShopTransport` przepiete na repozytorium.
|
|
|
|
### Routing admin (admin\Site::route())
|
|
1. Sprawdź mapę `$newControllers` → utwórz instancję z DI → wywołaj
|
|
2. Jeśli nowy kontroler nie istnieje (`class_exists()` = false) → fallback na `admin\controls\`
|
|
3. Stary kontroler jest NIEZALEŻNY od nowych klas (bezpieczny fallback)
|
|
|
|
### Dependency Injection
|
|
Nowe klasy używają **Dependency Injection** zamiast `global` variables:
|
|
```php
|
|
// STARE
|
|
global $mdb;
|
|
$quantity = $mdb->get('pp_shop_products', 'quantity', ['id' => $id]);
|
|
|
|
// NOWE
|
|
$repository = new \Domain\Product\ProductRepository($mdb);
|
|
$quantity = $repository->getQuantity($id);
|
|
```
|
|
|
|
## Testowanie (tylko dla deweloperów)
|
|
|
|
**UWAGA:** Pliki testów NIE są częścią aktualizacji dla klientów!
|
|
|
|
### Narzędzia
|
|
- **PHPUnit 9.6.34** - framework testowy
|
|
- **test.bat** - uruchamianie testów
|
|
- **composer.json** - autoloading PSR-4
|
|
|
|
Pelna dokumentacja testow: `TESTING.md`
|
|
|
|
---
|
|
*Dokument aktualizowany: 2026-02-14*
|