Beitragsnavigation als Baustein (Dokumentschema v18)
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: "Beitragsseite gefaellt mir nicht, sollte wie bei kant-it.de sein
oder besser. Falls noetig Plugin bauen."

Die Originalseite hat Galerie, Vor/Zurueck zwischen Projekten und einen
Abschlussaufruf. Galerie und Aufruf gab es laengst - sie waren nur nicht
benutzt. Die Navigation gab es nicht.

Kein Plugin: ein Plugin ist hier ein Bausteintyp, dessen Eigenschaften der
Kern aufbewahrt, aber nicht rendert - es koennte also nichts ausgeben,
solange es keine Laufzeit dafuer gibt. Und die Nachbarn eines Beitrags
stehen in derselben Tabelle wie die Beitragsliste, die der Kern schon
fuellt. Also ein Baustein: postnav.

Gespeichert sind zwei Beschriftungen, mehr nicht - welcher Beitrag vorher
und nachher kommt, entscheidet der Renderer. Gesucht wird innerhalb
derselben Kategorie, und am Rand wird nicht umgebrochen.

Ausserdem: die uebernommenen Projekttexte begannen mit dem wiederholten
Titel (20 Beitraege), und schmale Abschnitte standen links statt mittig -
max-width ohne margin:auto ist eine halbe Einstellung.

Geprueft: 396 Tests unter PHP 8.2 und 8.4, 18 JS-Tests, Editortest,
Browserpruefung, axe ohne Verstoss auf der Beitragsseite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kantarciandClaude Opus 5 committed 2026-09-13 10:56:18 +02:00
1 parent 5a5933f8cd
commit 1b22265a54
14 files changed
+148 -14

No files matched your search

+37
View File
@@ -717,6 +717,43 @@ final class CmsTest extends TestCase
self::assertStringContainsString("'pointerdown', 'keydown', 'touchstart', 'wheel'", $skript);
}
public function testAPostCanPointToItsNeighboursWithoutStoringThem(): void
{
// Die Beitragsseite endete bisher im Nichts: gelesen, und dann? Der neue Baustein führt
// zum nächsten Beitrag - innerhalb derselben Kategorie, denn von einem Projekt führt man
// zum nächsten Projekt und nicht zur nächsten Pressemitteilung.
foreach ([['eins', '2026-02-01'], ['zwei', '2026-02-02'], ['drei', '2026-02-03']] as [$slug, $datum]) {
$this->publishedPost('projekt-'.$slug, 'Projekt '.$slug, $datum, ['Projekte'], []);
}
$this->publishedPost('notiz', 'Eine Notiz', '2026-02-04', ['Notizen'], []);
$mitte = $this->db->fetchOne('SELECT id FROM page WHERE path = ?', ['projekt-zwei']);
$document = DemoContent::starter('Projekt zwei', 'post');
$document['schemaVersion'] = 18;
$document['blocks'][] = ['id' => 'weiter', 'type' => 'postnav', 'props' => ['previousLabel' => 'Vorheriges Projekt', 'nextLabel' => 'Nächstes Projekt']];
$this->pages->publish($mitte, $this->pages->saveDraft($mitte, $document, $this->pages->findForEditor($mitte)['version']), $this->pages->findForEditor($mitte)['version']);
$html = $this->request('/projekt-zwei')->getContent();
// Neuer steht im Archiv oben, also ist „vorheriges" der neuere Beitrag.
self::assertStringContainsString('Projekt drei', $html);
self::assertStringContainsString('Projekt eins', $html);
self::assertStringContainsString('Vorheriges Projekt', $html);
// Die Notiz gehört in eine andere Kategorie und taucht nicht auf.
self::assertStringNotContainsString('Eine Notiz', $html);
// Und im gespeicherten Dokument steht kein Beitrag - nur die Beschriftungen.
$stored = $this->pages->findPublished('projekt-zwei')['document'];
self::assertSame(['previousLabel' => 'Vorheriges Projekt', 'nextLabel' => 'Nächstes Projekt'], end($stored['blocks'])['props']);
// Am Rand wird nicht umgebrochen: der neueste Beitrag hat keinen Vorgänger.
$neuestes = $this->db->fetchOne('SELECT id FROM page WHERE path = ?', ['projekt-drei']);
$document['title'] = 'Projekt drei';
$this->pages->publish($neuestes, $this->pages->saveDraft($neuestes, $document, $this->pages->findForEditor($neuestes)['version']), $this->pages->findForEditor($neuestes)['version']);
$rand = $this->request('/projekt-drei')->getContent();
self::assertStringNotContainsString('Vorheriges Projekt', $rand);
self::assertStringContainsString('Nächstes Projekt', $rand);
}
public function testAPostListCanPageThroughEverythingInsteadOfCuttingOff(): void
{
// Umut: „fehlt die Pagination bei Projekte? Es werden nur 12 angezeigt.“ Richtig: eine