Zum Hauptinhalt springen

Einen eigenen Content-Typ bauen (per Code)

Wann Code statt No-Code-Builder

Der No-Code-Builder (siehe Nutzer-Dokumentation) reicht für die meisten Fälle. Echter Code lohnt sich, sobald typ-spezifische SONDERFELDER gebraucht werden, die über Titel/Text/Kategorien/Tags/Beitragsbild hinausgehen - z.B. Position und Foto bei einem Team-Mitglied.

Ordnerstruktur

repository/contents/MeinTyp/
  manifest.json
  ContentType.php
  templates/default/single.tpl
  templates/default/teaser.tpl
  templates/default/archive.tpl

Ein Content-Typ liefert AUSSCHLIESSLICH Daten - kein HTML, kein Wissen über Themes. Allgemeine Felder (Titel, Slug, Body, Erstellungsdatum) muss er NICHT wiederholen, die stellt ContentTypeFactory automatisch bereit - getViewData() liefert nur die TYP-SPEZIFISCHEN Zusatzfelder, aus content->getExtra() ausgelesen (dort landet alles, was per renderAdminFields()/parseAdminFields() im Admin-Formular eingegeben wurde, als JSON gespeichert).

— Wichtigste Architektur-Regel für Content-Typen

ContentType.php

namespace Contents\MeinTyp;

use Nexis\Content\Content;
use Nexis\Content\ContentTypeAdminInterface;
use Nexis\Content\ContentTypeInterface;

class ContentType implements ContentTypeInterface, ContentTypeAdminInterface {

    public function getViewData(Content $content): array {
        $extra = $content->getExtra();
        return ['sonderfeld' => $extra['sonderfeld'] ?? null];
    }

    public function renderAdminFields(array $extra): string {
        $wert = htmlspecialchars($extra['sonderfeld'] ?? '');
        return <<<FORMHTML
        <div class="col-12">
          <label class="form-label" for="sonderfeld">Sonderfeld</label>
          <input class="form-control" id="sonderfeld" type="text" name="sonderfeld" value="{$wert}">
        </div>
        FORMHTML;
    }

    public function parseAdminFields(array $post): array {
        return ['sonderfeld' => trim($post['sonderfeld'] ?? '') ?: null];
    }
}

ContentTypeAdminInterface ist optional

Nur nötig, wenn der Typ eigene Zusatzfelder im Admin-Formular braucht (wie oben). Reicht ContentTypeInterface allein, bleibt das Admin-Formular auf die allgemeinen Felder beschränkt.

Eigene Standard-Templates mitliefern

Genau wie bei den Erweiterungen Shop/Features/Partner/NewsBlog: eigene Standard-Vorlagen unter templates/default/ mitliefern, damit der Typ automatisch in JEDEM Theme funktioniert, auch ohne dass das jeweilige Theme selbst eine typ-spezifische Vorlage mitbringen müsste.

Vollständiges Beispiel zum Herunterladen

Ein Content-Typ "Team-Mitglied" - genau das oben gezeigte Muster, real installierbar und getestet, inklusive aller drei Templates (single/teaser/archive).

ExampleContentType.zip herunterladen

Hinweis: Wer einen eigenen Content-Typ im NexisCore-Marktplatz veröffentlichen möchte, kann optional eine market.md beilegen und den Schnellupload nutzen, statt das Formular von Hand auszufüllen. Mehr dazu: Schnellupload & market.md →