Skip to content

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:

  1. Zaimplementuj Modules\Core\Contracts\SlugResolver — metoda resolve(string $slug) zwraca odpowiedź Inertia albo null, gdy slug nie należy do modułu.
  2. Dopisz klasę do stałej RESOLVERS w app/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.

Made by Moonbite