Architektura
Renick.Content ma trzy warstwy:
- Treść. Dokument to lista typowanych bloków zapisana jako JSON w polu hosta: we wpisie Tailora, atrybucie modelu, stronie RainLab.Pages lub wpisie RainLab.Blog. Format definiuje JSON Schema v1; każdy zapis jest walidowany.
- Edytor. Wyspa TipTap 3 / React 19 montowana przez form widget
contenteditor. Paczka wassets/distjest zacommitowana, więc instalacja nigdy nie uruchamia toolchaina JS. - Renderowanie.
BlockRendererzamienia JSON na HTML przy każdym żądaniu (przezrenickContent,content_render()lub|rc_blocks) i stosuje reguły widoczności po stronie serwera.
Mapa komponentów
Przy zapisie DocumentSaveGuard normalizuje dokument, ściśle go waliduje i sprawdza BlockRules. Naruszenia reguł, które zapisany dokument już miał, nie blokują zapisu. Po zapisaniu hosta zapisywana jest wersja i odświeżany indeks użycia mediów.
Dokument żyje w hoście. Własne tabele wtyczki są pomocnicze: renick_content_versions (snapshoty, dziennik audytu), renick_content_templates, renick_content_media_usage, renick_content_shared (Treść współdzielona), renick_content_scripts (Skrypty niestandardowe), renick_content_api_tokens (hashowane) i renick_content_ai_usage (miesięczny budżet AI).
Gdzie co się znajduje
plugins/renick/content/
├── Plugin.php # registrations only
├── routes.php # REST API (off by default), tile/thumb proxies, form endpoints
├── blocks/ # <handle>/<handle>.yaml definition + <handle>.htm partial
├── classes/ # renderer, document model, Content/ContentApi facades, Integrations/, TailorList/, ai/
├── components/ # renickContent, Entry List, submission form
├── contentfields/ # Tailor content field
├── controllers/ # backend pages (tokens, audit log, scripts, shared content, templates)
├── formwidgets/ # ContentEditor, icon picker
├── console/ # renick:content:* commands
├── models/
├── schema/document-v1.json
├── assets/ # src/ editor source; dist/ and frontend/ committed bundles
└── tests/ # PHPUnit; Playwright e2e lives in /tests-e2eZacznij od Hostowanie pola, Tworzenie bloków, API PHP lub API REST.