Motyw
Treści i API
Moduły Laravel są źródłem danych zarówno dla panelu CMS, jak i publicznej witryny. Panel zapisuje treść przez chronione API. Motyw dostaje treści po stronie Laravel jako propsy Inertia. Publiczne endpointy API służą do odczytu danych poza kontrolerami motywu.
Granica API
Trasy modułów rejestrują providery w Modules/*/Providers/RouteServiceProvider.php z plików Modules/*/Http/Routes. Operacje administracyjne są chronione przez auth:api i uprawnienia modułu; publiczne odczyty są grupowane pod api/public i ograniczane przez PublishedScope do opublikowanych danych.
Kontrolery API walidują wejście przez Form Requests i zwracają Resources. Kontrolery web używają tych samych publicznych Resources, a potem przekazują rozwiązane dane jako propsy Inertia. Budowę modułów opisuje sekcja Backend.
Strony i inne typy treści
Stronę CMS rozwiązuje PageController na podstawie sluga i mapy page.types w Modules/Page/Config/config.php. Typ strony może mieć dedykowany handler i komponent Inertia albo użyć strony generycznej; dodawanie typu opisuje Motyw.
Moduł może przejąć slug przed PageController. W tym celu:
- Zaimplementuj
Modules\Core\Contracts\SlugResolver— metodaresolve(string $slug)zwraca odpowiedź Inertia albonull, gdy slug nie należy do modułu. - Dopisz klasę do stałej
RESOLVERSwapp/Http/Controllers/SlugController.php. Sama implementacja interfejsu nie wystarczy; w bazowym repozytorium lista jest pusta.
Resolvery są pytane w kolejności z listy, co ma znaczenie przy kolizji slugów.
Sekcje Content Buildera są zapisywane przy obsługiwanym modelu; motyw decyduje o ich wyglądzie, a PublishedScope odfiltrowuje nieopublikowane grupy i sekcje.
Sekcje współdzielone
Sekcja współdzielona (SharedSection) jest rekordem modułu ContentBuilder. Model używa HasContentBuilder i HasCustomFields, więc przechowuje sekcje Content Buildera oraz wartości custom fields. Chronione endpointy pozwalają panelowi pobierać, tworzyć, aktualizować i usuwać sekcje; publiczne endpointy zwracają je przez PublicSharedSectionResource. Sam rekord nie ma flagi publikacji — filtrowane są dopiero jego grupy i sekcje.
Motyw może dostać sekcję współdzieloną na dwa niezależne sposoby:
- Jako blok w treści strony. Redaktor wstawia w Content Builderze blok typu
shared-section; motyw renderuje go razem z pozostałymi sekcjami strony. - Jako prop wskazany w kodzie. Kontroler lub handler typu strony pobiera sekcję po jej typie:
php
use Modules\ContentBuilder\Http\Inertia\SharedSectionProp;
'banners' => fn () => SharedSectionProp::make('banners'),SharedSectionProp::make() szuka rekordu po kolumnie type i zwraca dane z PublicSharedSectionResource (w tym publiczne custom fields) albo null, gdy sekcji o takim typie nie ma. W bazowym repozytorium nikt tej klasy nie wywołuje — używają jej projekty.
Typ jest unikalny: zapis sekcji z typem, który ma już inny rekord, zeruje typ w tamtym rekordzie.
Panel pozwala edytować sekcję współdzieloną z formularza strony; zmiana aktualizuje wspólny rekord i wpływa na wszystkie miejsca, które go używają.
Custom fields sekcji współdzielonych
Definicje custom fields dla typu sekcji współdzielonej rejestruje się w panelu, w repozytorium projektu. Backend przechowuje i udostępnia wartości, ale nie zna znaczenia pola ani sposobu jego wyświetlenia — pole odczytuje komponent motywu. Bazowe repozytoria nie definiują żadnych takich pól.
Rejestrację pól w panelu opisuje Custom fields panelu, a walidację po stronie backendu — Niestandardowe pola.