- Migrate ShopStatuses module to Domain + DI architecture - Add ShopStatusRepository, ShopStatusesController with color picker - Convert front\factory\ShopStatuses to facade - Add FormFieldType::COLOR with HTML5 color picker - Move documentation files to docs/ folder (PROJECT_STRUCTURE, REFACTORING_PLAN, CHANGELOG, FORM_EDIT_SYSTEM, TESTING, DATABASE_STRUCTURE) - Tests: 254 tests, 736 assertions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8.5 KiB
8.5 KiB
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łączeniagetConnection()- zwraca obiekt Redis
CacheHandler
- Plik:
autoload/class.CacheHandler.php - Opis: Handler do obsługi cache Redis
- Metody:
get($key)- pobiera wartość z cacheset($key, $value, $ttl = 86400)- zapisuje wartość do cacheexists($key)- sprawdza czy klucz istniejedelete($key)- usuwa pojedynczy kluczdeletePattern($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:
- Pokazuje spinner "Czyszczę cache..."
- Czyści katalogi:
temp/,thumbs/ - Wykonuje
flushAll()na Redis - Pokazuje "Cache wyczyszczony!" przez 2 sekundy
- 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łównepp_shop_products_langs- tłumaczenia produktówpp_shop_products_images- zdjęcia produktówpp_shop_products_categories- kategorie produktówpp_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)
Pelna dokumentacja tabel: DATABASE_STRUCTURE.md
Konfiguracja
Redis
- Konfiguracja:
config.php(zmienna$config['redis']) - Parametry: host, port, password
Autoload
- Funkcja:
__autoload_my_classes()wcron.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 SEOnormalize_decimal($val, $precision)- normalizacja liczbsend_email()- wysyłanie emailidelete_dir($dir)- usuwanie katalogówhtacces()- 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
// 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
│ └── ...
├── 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
Routing admin (admin\Site::route())
- Sprawdź mapę
$newControllers→ utwórz instancję z DI → wywołaj - Jeśli nowy kontroler nie istnieje (
class_exists()= false) → fallback naadmin\controls\ - Stary kontroler jest NIEZALEŻNY od nowych klas (bezpieczny fallback)
Dependency Injection
Nowe klasy używają Dependency Injection zamiast global variables:
// 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