srhinow / simple-link-bundle
simple link manager with link-categories for Contao CMS
Package info
gitlab.com/srhinow/simple-link-bundle
Type:contao-bundle
pkg:composer/srhinow/simple-link-bundle
Requires
- php: >=8.2
- contao/core-bundle: ^5.3
- doctrine/dbal: ^3.6
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.68
- phpunit/phpunit: ^11.0
README
Ein schlankes Contao-Bundle zur zentralen Verwaltung von Links mit hierarchischen Kategorien. Links lassen sich im Backend kategorisiert pflegen und im Frontend über zwei verschiedene Frontend-Module ausgeben — einmal als flache Kategorienliste, einmal mit Unterkategorie-Struktur.
Anforderungen
| Abhängigkeit | Version |
|---|---|
| PHP | ≥ 8.2 |
| Contao Core Bundle | ^5.3 |
| Doctrine DBAL | ^3.6 |
Installation
composer require srhinow/simple-link-bundle
Nach der Installation die Datenbank-Migration ausführen:
php bin/console contao:migrate
Funktionsumfang
Backend
Das Bundle fügt unter der Gruppe „content" das Backend-Modul „Links" (do=links) hinzu. Es besteht aus zwei Verwaltungsbereichen, die über die globale Operation „Link Kategorien" verknüpft sind.
Link-Kategorien (tl_link_categories)
Kategorien sind hierarchisch aufgebaut (Baumstruktur via pid). Unterkategorien können beliebig tief verschachtelt werden. Die Sortierung erfolgt per Drag & Drop im Baum.
| Feld | Beschreibung |
|---|---|
| Name | Bezeichnung der Kategorie (Pflichtfeld, max. 255 Zeichen) |
| Alias | URL-freundlicher Bezeichner, wird als Anker-ID im Frontend genutzt |
Verfügbare Aktionen: Bearbeiten · Kopieren · Kopieren mit Unterkategorien · Verschieben · Löschen · Anzeigen
Links (tl_links)
Jeder Link gehört genau einer Kategorie an und enthält eine URL sowie optionale Metadaten.
| Feld | Beschreibung |
|---|---|
| Name | Angezeigter Linktext (Pflichtfeld, max. 255 Zeichen) |
| Alias | URL-freundlicher Bezeichner (automatisch generiert, alphanumerisch) |
| Kategorie | Zuordnung zu einer Link-Kategorie (Pflichtfeld, Dropdown mit Chosen) |
| URL | Zieladresse des Links (Pflichtfeld, URL-Validierung, DCA-Picker unterstützt) |
| Beschreibung | Optionaler Erläuterungstext, der neben dem Link erscheint |
| Online sichtbar | Veröffentlichungs-Flag; nur aktivierte Links werden im Frontend angezeigt |
Die Listenansicht zeigt URL und Name als klickbaren Link. Über die Filter-Leiste kann nach Kategorie gefiltert werden.
Frontend-Module
Das Bundle registriert zwei Frontend-Module in der Gruppe „Einfache Links":
1. Link-Liste (link_list)
Zeigt alle Root-Kategorien (oberste Ebene) mit ihren direkt zugeordneten Links. Jede Kategorie wird als aufklappbarer Accordion-Bereich dargestellt.
Einstellungsfelder im Backend:
| Feld | Beschreibung |
|---|---|
| Überschrift | Optionale Modulüberschrift |
| Link-Template | Auswahl des Item-Templates (alle Templates mit Präfix link_) |
Haupttemplate: mod_link_list.html.twig
Verfügbare Template-Variablen in mod_link_list.html.twig:
| Variable | Typ | Beschreibung |
|---|---|---|
categories | array | Array von Kategorie-Objekten (siehe unten) |
empty | string | Meldung bei leerer Liste |
Struktur eines categories-Eintrags:
| Schlüssel | Beschreibung |
|---|---|
id | Kategorie-ID |
name | Kategoriename |
alias | Kategorie-Alias |
entries | Array von gerenderten Link-HTML-Strings (via Item-Template) |
2. Link-Liste mit Unterkategorien (sub_category_link_list)
Zeigt Root-Kategorien mit ihren Unterkategorien. Jede Unterkategorie erhält eine eigene Überschrift und Linkliste. Root-Kategorien ohne Unterkategorien werden übersprungen.
Gleiche Backend-Einstellungen wie link_list.
Haupttemplate: mod_link_list.html.twig (dasselbe Wrapper-Template)
Struktur eines categories-Eintrags (hier entries = array von gerenderten Unterkategorie-Blöcken als HTML-Strings):
| Schlüssel | Beschreibung |
|---|---|
id | Root-Kategorie-ID |
name | Root-Kategoriename |
alias | Root-Kategorie-Alias |
entries | Array von gerenderten Unterkategorie-HTML-Strings (via link_in_subcategory.html.twig) |
Templates
mod_link_list.html.twig
Wrapper-Template für beide Module. Gibt Kategorien als Accordion aus:
{% for cat in categories %}
<div class="toggler">
<h2>...</h2>
</div>
<div class="accordion">
{% for entry in cat.entries %}{{ entry|raw }}{% endfor %}
</div>
{% endfor %}
link_default.html.twig
Standard-Item-Template für einen einzelnen Link (genutzt von link_list).
Verfügbare Variablen:
| Variable | Beschreibung |
|---|---|
url | Ziel-URL |
name | Linktext |
description | Optionaler Beschreibungstext |
class | CSS-Klassen (first, last, odd, even) |
alias | Link-Alias |
link_in_subcategory.html.twig
Template für eine Unterkategorie mit allen ihren Links (genutzt von sub_category_link_list).
Verfügbare Variablen:
| Variable | Beschreibung |
|---|---|
catName | Name der Unterkategorie |
catAlias | Alias der Unterkategorie (als Anker-ID) |
css | CSS-Klassen der Unterkategorie (first, last, odd, even) |
entries | Array von Link-Datenarrays (siehe unten) |
Struktur eines entries-Eintrags:
| Schlüssel | Beschreibung |
|---|---|
name | Linktext |
alias | Link-Alias |
url | Ziel-URL |
description | Optionaler Beschreibungstext |
css | CSS-Klassen des Links (first, last, odd, even) |
count | Position in der Liste (1-basiert) |
limit | Gesamtanzahl der Links in dieser Unterkategorie |
Templates anpassen
Alle Templates liegen im Bundle unter contao/templates/. Für projektspezifische Anpassungen die gewünschte Datei in den Projekt-Templates-Ordner kopieren:
templates/
└── bz-niedersachsen/
├── mod_link_list.html.twig # Wrapper beider Module
├── link_default.html.twig # Einzelner Link (flache Liste)
└── link_in_subcategory.html.twig # Unterkategorie mit Links
Eigene Link-Item-Templates müssen mit dem Präfix link_ beginnen, damit sie im Backend-Dropdown erscheinen.
Datenbankstruktur
tl_link_categories
| Spalte | Typ | Beschreibung |
|---|---|---|
id | int unsigned | Primärschlüssel |
pid | int unsigned | Eltern-Kategorie (0 = Root) |
sorting | int unsigned | Sortierungsreihenfolge |
tstamp | int unsigned | Zeitstempel letzte Änderung |
modify | int unsigned | Zeitstempel letzte Modifikation |
name | varchar(255) | Kategoriename |
alias | varchar(128) | URL-Alias |
tl_links
| Spalte | Typ | Beschreibung |
|---|---|---|
id | int unsigned | Primärschlüssel |
tstamp | int unsigned | Zeitstempel letzte Änderung |
modify | int unsigned | Zeitstempel letzte Modifikation |
sorting | int unsigned | Sortierungsreihenfolge |
name | varchar(255) | Linkbezeichnung |
alias | varchar(128) | URL-Alias |
category | int unsigned | Fremdschlüssel → tl_link_categories.id |
url | varchar(255) | Ziel-URL |
description | text | Optionaler Beschreibungstext |
published | boolean | Veröffentlichungs-Flag |
Aufbau einer Kategorienhierarchie (Empfehlung)
Link-Kategorien (Backend)
├── Kategorie A (pid=0, Root)
│ ├── Unterkategorie A1 (pid=A)
│ └── Unterkategorie A2 (pid=A)
└── Kategorie B (pid=0, Root)
└── Unterkategorie B1 (pid=B)
- Für
link_list: Direkte Links unter Root-Kategorien anlegen. - Für
sub_category_link_list: Links unter Unterkategorien anlegen; Root-Kategorien dienen nur als Gruppenüberschrift.
Changelog
Siehe Changelog.md für die vollständige Versionshistorie.
Lizenz
GPL-3.0+
Autor
Sven Rhinow — sr-tag.de
Support: kservice@sr-tag.de
Quellcode: gitlab.com/srhinow/simple-link-bundle