PHP API
Zwei Fassaden mit statischen Methoden decken die programmatische Arbeit mit Dokumenten ab; auch die REST API und die Bundle-CLI-Befehle nutzen sie.
Renick\Content\Classes\Content
Die schreibsichere Fassade. Jeder Schreibvorgang normalisiert und validiert das Dokument strikt (ApplicationException bei Fehlern), sichert den vorherigen Zustand, damit er sich rückgängig machen lässt, speichert den Host in seinem eigenen Site-Kontext, zeichnet eine Version auf und reindiziert die Media Usage.
| Methode | Verhalten |
|---|---|
get(Model $host, string $field): array | dekodiertes Dokument; ['blocks' => []] bei leerem oder ungültigem Inhalt |
put(Model $host, string $field, string|array $document, string $action = 'import'): array | der obige Schreibvorgang; gibt das normalisierte Dokument zurück |
duplicate(Model $host, string $field, ?Model $targetHost = null): array | Kopie mit neuen Block-IDs, nach $targetHost geschrieben, falls angegeben |
export(Model $host, string $field): array | ['document' => …, 'media' => [paths…]] |
import(Model $host, string $field, array $bundle, string $mode = 'replace'): array | schreibt $bundle['document']; es gibt nur den Modus replace |
exportBundle(Model $host, string $field): string | ZIP-Bytes: document.json, manifest.json, media/<pfad>; fehlende Dateien stehen im Manifest |
exportBundleToFile(Model $host, string $field): string | dasselbe ZIP als temporäre Datei, die der Aufrufer löscht |
importBundle(Model $host, string $field, string $zipBytes, string $mode = 'replace', bool $overwriteMedia = false): array | schreibt das Dokument und stellt dann die Medien wieder her (vorhandene Dateien bleiben, außer bei $overwriteMedia); liefert document, media (restored, skipped, failed) und portability. Fehlgeschlagene Medien werfen BundleImportException mit dem Teilergebnis in getResult() |
applyTemplate(Model $host, string $field, Template $template): array | ersetzt das Dokument durch eine Kopie der Vorlage mit neuen IDs |
translate(Model $host, string $field, string $targetLanguage, ?string $sourceLanguage = null): array | übersetzt per KI und schreibt; gibt ['document' => …, 'warning' => ?string] zurück |
Versionen werden per Content-Hash dedupliziert; aufbewahrt werden die neuesten 50 ungepinnten Snapshots pro Host und Feld (renick.content::versions.keep).
Renick\Content\Classes\ContentApi
Reine Helfer ohne Persistenz:
| Methode | Verhalten |
|---|---|
duplicateDocument(string|array $document): string|array | tiefe Kopie mit frischen b_…-IDs; gibt den übergebenen Typ zurück |
duplicateBlock(array $block): array | neue IDs für einen Block-Teilbaum |
toPlainText(string|array $document): string | Text aus text, title, caption, alt, author, label und html ohne Tags, für Suche und SEO |
excerpt(string|array $document, int $limit = 160): string | gekürzter Klartext |
Rufe duplicateDocument() immer auf, wenn du einen Datensatz mit Dokument klonst: Block-IDs müssen pro Dokument eindeutig bleiben.
Events
Die meisten Events stehen unter Events. Die Media- und KI-Events:
| Event | Ausgelöst | Payload / Rückgabe |
|---|---|---|
renick.content.media.collectUsage | bei jedem Media-Reindex eines Hosts + Felds | ($host, $fieldName, $decodedDocument); gib zusätzliche Medienpfade für Usage-Index und Delete Guard zurück |
renick.content.ai.beforeRequest | vor jedem KI-Chat-Request (halting) | (&$payload) per Referenz; gib ein geändertes Array zurück, um ihn zu ersetzen |
Event::listen('renick.content.media.collectUsage', function ($host, $fieldName, $document) {
return ['/seo/og-image.png'];
});