Drei Aufbauten fuer neue Beitraege
CMS quality / php (8.2) (push) Canceled after 0s
CMS quality / php (8.4) (push) Canceled after 0s
CMS quality / browser (push) Canceled after 0s
CMS quality / mysql (push) Canceled after 0s

Umut wollte mehrere Designs zur Auswahl. Bei Seiten waere das falsch -
dort weiss vorher niemand, was daraus wird. Bei Beitraegen ist die Form
fast immer dieselbe, und wer jedes Mal von vorn anfaengt, baut jedes Mal
etwas leicht anderes.

Bildkopf (Bild ueber die volle Breite, Titel darauf), Klassisch (Titel und
Vorspann schmal, Bild darunter) und Magazin (Titel neben den Eckdaten).
Gewaehlt wird beim Anlegen; danach ist jeder Block aenderbar wie jeder
andere. Kein Aufbau verlaesst sich auf ein Bild, das es noch nicht gibt.

Dabei ist eine Regel gefallen: der erste Textblock eines Abschnitts wurde
automatisch zur Kleinbeschriftung in Akzentfarbe. Das gestaltet nach
Position statt nach Absicht - im Fussbereich wurde daraus roter
Versalientext, in der Magazin-Vorlage aus dem Einstiegsabsatz eine
Beschriftung. Wer eine Beschriftung will, stellt sie ein.

Geprueft: 398 Tests unter PHP 8.2 und 8.4, Editortest, Browserpruefung,
axe ohne Verstoss auf allen drei Aufbauten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kantarciandClaude Opus 5 committed 2026-09-13 11:12:16 +02:00
1 parent 1b22265a54
commit 84e88c6636
7 files changed
+331 -5

No files matched your search

+41
View File
@@ -10,6 +10,7 @@ use App\Content\MediaLibrary;
use App\Content\MenuRepository;
use App\Content\PageRepository;
use App\Content\PartialRepository;
use App\Content\PostLayouts;
use App\Content\PostRepository;
use App\Content\RedirectRepository;
use App\Content\RichText;
@@ -717,6 +718,46 @@ final class CmsTest extends TestCase
self::assertStringContainsString("'pointerdown', 'keydown', 'touchstart', 'wheel'", $skript);
}
public function testANewPostStartsFromOneOfThreeLayouts(): void
{
// Umut wollte mehrere Aufbauten zur Auswahl. Ein leeres Dokument ist für eine Seite
// richtig - dort weiß niemand vorher, was daraus wird -, für einen Beitrag fast nie.
self::assertSame(['bildkopf', 'klassisch', 'magazin'], array_keys(PostLayouts::all()));
foreach (PostLayouts::all() as $key => $layout) {
$document = PostLayouts::document($key, 'Ein Beitrag');
// Jeder Aufbau ist ein gültiges Dokument mit genau einer Hauptüberschrift.
(new DocumentValidator())->validate($document);
self::assertSame(18, $document['schemaVersion'], $key);
self::assertNotSame('', $layout['description'], $key);
$id = $this->pages->createPage('beitrag-'.$key, null, 'post', $document);
$page = $this->pages->findForEditor($id);
$this->pages->publish($id, $page['draft_revision_id'], $page['version']);
$html = $this->request('/beitrag-'.$key)->getContent();
self::assertStringContainsString('Ein Beitrag', $html, $key);
// Jeder Aufbau endet mit einem Weg weiter, keiner im Nichts.
self::assertStringContainsString('block-postnav', $html, $key);
}
// Ein erfundener Aufbau fällt auf die Voreinstellung zurück statt zu scheitern.
self::assertFalse(PostLayouts::exists('gibtsnicht'));
self::assertSame(
PostLayouts::document(PostLayouts::DEFAULT, 'X'),
PostLayouts::document('gibtsnicht', 'X'),
);
}
public function testTheFirstTextOfASectionIsNoLongerSilentlyTurnedIntoALabel(): void
{
// Diese Regel gestaltete nach Position statt nach Absicht: im Fußbereich wurde aus dem
// Firmennamen roter Versalientext, in einer Beitragsvorlage aus dem Einstiegsabsatz eine
// Kleinbeschriftung. Wer eine Beschriftung will, stellt sie ein.
$css = (string) file_get_contents(__DIR__.'/../public/assets/site.css');
self::assertStringNotContainsString('.section-inner>.block-text:first-child', $css);
self::assertStringNotContainsString('.block-column>.block-text:first-child', $css);
}
public function testAPostCanPointToItsNeighboursWithoutStoringThem(): void
{
// Die Beitragsseite endete bisher im Nichts: gelesen, und dann? Der neue Baustein führt