Files
cmsPRO/docs/PROJECT_STRUCTURE.md
Jacek Pyziak a3caeb9a9a feat(06-admin-base): Admin\ base infrastructure — Form Edit System + Support layer (Phase 6)
Phase 6 zamknięta po 2 planach. Pełny fundament dla Phase 7-13 (migracja
17 admin controllers do Admin\ namespace).

06-01 (Forms infrastructure):
- Admin\ViewModels\Forms\* — 5 ViewModeli (687 L)
- Admin\Validation\FormValidator (196 L)
- composer.json: php >=7.4, PSR-4 paths cross-platform safe
  (Admin\ → autoload/admin/, Frontend\ → autoload/front/)

06-02 (Support layer):
- Admin\Support\TableListRequestFactory (99 L) — parser list z $_GET
- Admin\Support\Forms\FormRequestHandler (159 L) — POST + CSRF + walidacja + persist
- Admin\Support\Forms\FormFieldRenderer (494 L) — renderer HTML pól

Decyzje:
- Brak BaseController — Phase 7+ kontrolery jako POJOs z DI (jak shopPRO)
- PSR-4 filename fix: TableListRequestFactory.php (bez shopPRO 'class.' prefix)
- PascalCase namespace (Admin\Support) na lowercase folder admin/
  ze względu na Windows fs case-insensitivity vs legacy admin/controls/

Pliki: 8 nowych klas, 1635 L kodu PHP 7.4-kompatybilnego, zero regresji.
Smoke test: walidacja e-maila zwraca PL komunikat, factory parsuje
?page=&per_page=&sort=&filter=, Domain/Shared nadal ładują się.

PHPUnit: 37/37 OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 23:32:26 +02:00

6.7 KiB
Raw Blame History

Struktura projektu cmsPRO

Punkty wejścia

Plik Opis
index.php Router frontendu
admin/index.php Router panelu admina
ajax.php AJAX frontend
admin/ajax.php AJAX admin
api.php Publiczne API
cron.php Zadania cykliczne (newsletter)
download.php Chronione pobieranie plików

Każdy punkt wejścia ładuje centralny autoloader (hybrydowy PSR-4 + legacy):

require_once __DIR__ . '/autoload/autoloader.php';

Wzorzec architektoniczny — Static Factory (MVCish)

autoload/{admin|front}/
├── controls/class.{Module}.php   ← obsługa requestów
├── factory/class.{Module}.php    ← logika biznesowa + DB
└── view/class.{Module}.php       ← generowanie HTML

Przestrzenie nazw: \admin\controls, \admin\factory, \admin\view, \front\controls, \front\factory, \front\view


Refaktoryzacja DDD — stan aktualny

Projekt migruje stopniowo do architektury DDD. Stare klasy stają się cienkimi wrapperami delegującymi do nowych klas w Shared\ i Domain\.

Faza 0 ✓ — Autoloader PSR-4

Centralny autoloader w autoload/autoloader.php (hybrydowy: PSR-4 + legacy class.*.php). Wszystkie 7 punktów wejścia używają jednego pliku. composer.json z PSR-4 mapowaniem: Domain, Shared, Admin, Frontend\ → autoload/.

Faza 1 ✓ — Shared utilities (autoload/Shared/)

autoload/Shared/
├── Cache/CacheHandler.php       ← \Shared\Cache\CacheHandler
├── Email/Email.php              ← \Shared\Email\Email
├── Helpers/Helpers.php          ← \Shared\Helpers\Helpers
├── Html/Html.php                ← \Shared\Html\Html
├── Image/ImageManipulator.php   ← \Shared\Image\ImageManipulator
├── Security/CsrfToken.php       ← \Shared\Security\CsrfToken
└── Tpl/Tpl.php                  ← \Shared\Tpl\Tpl

Stare klasy (class.S.php, class.Cache.php, itd.) są teraz cienkimi wrapperami — zachowana pełna kompatybilność wsteczna. Helpers::send_email() → Email, Helpers::get_token()/is_token_valid() → CsrfToken.

Faza 2 ✓ — Domain Repositories (autoload/Domain/) — KOMPLETNE (13/13)

autoload/Domain/
├── Articles/ArticlesRepository.php             ← \Domain\Articles\ArticlesRepository     ✓
├── Authors/AuthorsRepository.php               ← \Domain\Authors\AuthorsRepository       ✓
├── Banners/BannersRepository.php               ← \Domain\Banners\BannersRepository       ✓
├── Cron/CronRepository.php                     ← \Domain\Cron\CronRepository             ✓
├── Languages/LanguagesRepository.php           ← \Domain\Languages\LanguagesRepository   ✓
├── Layouts/LayoutsRepository.php               ← \Domain\Layouts\LayoutsRepository       ✓
├── Newsletter/NewsletterRepository.php         ← \Domain\Newsletter\NewsletterRepository ✓
├── Pages/PagesRepository.php                   ← \Domain\Pages\PagesRepository           ✓
├── Releases/ReleasesRepository.php             ← \Domain\Releases\ReleasesRepository     ✓
├── Releases/UpdateRepository.php               ← \Domain\Releases\UpdateRepository       ✓
├── Scontainers/ScontainersRepository.php       ← \Domain\Scontainers\ScontainersRepository ✓
├── SeoAdditional/SeoAdditionalRepository.php   ← \Domain\SeoAdditional\SeoAdditionalRepository ✓
├── Settings/SettingsRepository.php             ← \Domain\Settings\SettingsRepository     ✓
└── User/UserRepository.php                     ← \Domain\User\UserRepository             ✓

Faza 6 ✓ — Admin\ Base Infrastructure (autoload/admin/{ViewModels,Validation,Support}/)

Skopiowane z shopPRO i przeniesione pod Admin\ (PSR-4 PascalCase namespace, lowercase folder ze względu na case-insensitive Windows fs):

autoload/admin/                    ← namespace Admin\* (nowe) + admin\* (legacy)
├── ViewModels/Forms/              ← Admin\ViewModels\Forms
│   ├── FormEditViewModel.php
│   ├── FormField.php
│   ├── FormFieldType.php
│   ├── FormTab.php
│   └── FormAction.php
├── Validation/
│   └── FormValidator.php          ← Admin\Validation\FormValidator
└── Support/
    ├── TableListRequestFactory.php  ← Admin\Support — parser list (page/per_page/sort/filter)
    └── Forms/
        ├── FormRequestHandler.php   ← Admin\Support\Forms — POST + CSRF + validate + persist
        └── FormFieldRenderer.php    ← Admin\Support\Forms — HTML renderer (deleguje Shared\Html\Html)

Decyzja: brak BaseController — Phase 7+ kontrolery będą POJOs z DI w konstruktorze (jak shopPRO BannerController(BannerRepository, LanguagesRepository)).

Następne: Admin\ controllers (Fazy 713), Frontend\ namespace (Fazy 1416).

Katalogi

Katalog Zawartość
autoload/ Klasy PHP (modele, kontrolery, fabryki, widoki, Shared, Domain)
admin/templates/ Szablony panelu admina (17 modułów)
templates/ Szablony frontendu (systemowe, tylko do odczytu)
templates_user/ Szablony frontendu (nadpisywalne przez użytkownika)
layout/ SCSS → CSS (style.scss → style.css)
upload/ Pliki użytkownika (article_images/, article_files/, filemanager/)
libraries/ Zewnętrzne biblioteki (Medoo, CKEditor, Bootstrap, jQuery…)
plugins/ Hooki (special-actions.php, -middle.php, -end.php)
migrations/ Pliki SQL per wersja (np. 0.304.sql)
updates/ Paczki ZIP aktualizacji
temp/ Cache plikowy (gzip, 24h, generowany automatycznie)
docs/ Dokumentacja techniczna

Kluczowe klasy

Klasa Opis
\Shared\Helpers\Helpers (class.S.php) Megautylita: sesja, cookie, email, SEO, detekcja botów
\Shared\Tpl\Tpl (class.Tpl.php) Silnik szablonów
\Shared\Cache\CacheHandler (class.Cache.php) Cache plikowy
\Shared\Html\Html (class.Html.php) Builder komponentów formularzy
\Shared\Image\ImageManipulator (class.Image.php) Manipulacja obrazami + WebP
class.Article.php Model artykułu (ArrayAccess, lazy multilang)

Baza danych

Prefiks tabel: pp_. ORM: Medoo (globalny $mdb). Konfiguracja: config.php.

Główne tabele: pp_users, pp_articles, pp_articles_langs, pp_pages, pp_pages_langs, pp_languages, pp_settings, pp_newsletter, pp_newsletter_users, pp_tags, pp_banners, pp_layouts, pp_backups.


System wielojęzyczny

  • Sesja: $_SESSION['current-lang']
  • Tabela: pp_languages
  • Składnia w treści: [LANG:klucz]
  • Cache tłumaczeń: $_SESSION['lang-{lang_id}']