Latest Tutorials Section
Die "Zuletzt hinzugefügt" Section zeigt dynamisch die neuesten Tutorials an – auf der Startseite, Kategorieseiten und in einzelnen Tutorials. Alles basiert auf einer automatisch generierten JSON-Datei.
Wie es funktioniert
Die Latest Tutorials Section besteht aus drei Komponenten, die zusammenarbeiten:
- generate-navigation.js – Erstellt beim Build die JSON-Datei mit allen Tutorial-Metadaten
- tutorials.json – Enthält Titel, Excerpt, URL und Kategorie aller Tutorials
- latest-tutorials.js – Lädt die JSON und rendert die Cards im Browser
Beim npm run build passiert Folgendes:
- Das Script liest alle Tutorials aus
TUTORIAL_ORDER - Für jedes Tutorial wird der Titel (aus H1 oder
CUSTOM_TITLES) und der Excerpt (aus.hero-subtitle) extrahiert - Die Daten werden in
/assets/data/tutorials.jsongespeichert - Im Browser lädt
latest-tutorials.jsdiese JSON und erstellt die Cards
Die LATEST_TUTORIALS Konfiguration
Welche Tutorials hier erscheinen, wird in LATEST_TUTORIALS in der
generate-navigation.js definiert.
In generate-navigation.js findest du die Konstante:
// Die neuesten Tutorials (manuell gepflegt)
const LATEST_TUTORIALS = [
'tutorials/css/css-specials/css-organization.html',
'tutorials/javascript/javascript-basics/js-security.html',
'tutorials/misc/web/console-security.html',
'tutorials/php/php-basics/php-security.html'
];
Neues Tutorial hinzufügen
- Den Pfad oben in
LATEST_TUTORIALSeinfügen - Den untersten Eintrag entfernen (um bei 4 zu bleiben)
npm run buildausführen
Variante 1: Startseite (Home)
Auf der Startseite werden die 4 Tutorials aus LATEST_TUTORIALS
angezeigt –
kategorieübergreifend.
HTML-Struktur
<!-- Latest Tutorials Section -->
<section class="categories">
<h2>Zuletzt hinzugefügt</h2>
<div id="latestTutorials" class="tutorials-grid">
<!-- Wird per JavaScript aus /assets/data/tutorials.json geladen -->
<p class="text-muted">Tutorials werden geladen...</p>
</div>
</section>
- Die ID muss
latestTutorialssein - Kein
data-categoryAttribut nötig - Das Script
latest-tutorials.jsmuss eingebunden sein
Was passiert im Browser?
Das Script latest-tutorials.js sucht nach #latestTutorials
und lädt die 4 Einträge aus data.latest in der JSON.
Variante 2: Kategorieseiten
Auf Kategorieseiten (z.B. /tutorials/css/index.html) werden die
neuesten Tutorials dieser Kategorie angezeigt.
HTML-Struktur
<!-- Latest Tutorials Section -->
<section class="categories">
<h2>Zuletzt hinzugefügt</h2>
<div id="categoryLatestTutorials" class="tutorials-grid" data-category="css">
<!-- Wird per JavaScript aus /assets/data/tutorials.json geladen -->
<p class="text-muted">Tutorials werden geladen...</p>
</div>
</section>
- Die ID muss
categoryLatestTutorialssein - Das
data-categoryAttribut bestimmt die Kategorie - Gültige Werte:
html,css,javascript,php,misc,documentation
Was passiert im Browser?
Das Script liest data-category aus und filtert die Tutorials aus
data.byCategory[category]. Es zeigt die letzten 4 dieser Kategorie.
Variante 3: In einzelnen Tutorials
Am Ende jedes Tutorials (vor den Prev/Next Buttons) werden verwandte Tutorials der gleichen Kategorie angezeigt – als "Mehr aus [Kategorie]".
HTML-Struktur
Die Struktur ist identisch mit Variante 2:
<!-- Latest Tutorials Section -->
<section class="categories">
<h2>Mehr aus CSS</h2>
<div id="categoryLatestTutorials" class="tutorials-grid" data-category="css">
<!-- Wird per JavaScript aus /assets/data/tutorials.json geladen -->
<p class="text-muted">Tutorials werden geladen...</p>
</div>
</section>
<!-- Prev/Next Navigation -->
<section class="tutorials-content">
<nav class="tutorial-nav"></nav>
</section>
Das Tutorial-Template enthält diese Section bereits. Wichtig: die
data-category auf die richtige Kategorie setzen
(oder es wird automatisch durch generate-navigation.js gesetzt).
Script einbinden nicht vergessen!
Das Script muss am Ende der Seite eingebunden sein:
<script src="/assets/js/latest-tutorials.js" defer></script>
Die tutorials.json Struktur
Die generierte JSON-Datei in /assets/data/tutorials.json hat folgende
Struktur:
{
"generated": "2025-06-03T18:23:43.522Z",
"total": 41,
"all": [
// Alle Tutorials
],
"latest": [
// Die 4 aus LATEST_TUTORIALS
{
"title": "CSS Organisation",
"excerpt": "Wie du dein CSS strukturierst...",
"url": "/tutorials/css/css-specials/css-organization.html",
"category": "css",
"categoryDisplay": "CSS",
"subcategory": "css-specials",
"subcategoryDisplay": "CSS Specials",
"badgeClass": "card-badge-css"
}
],
"byCategory": {
"html": [ /* HTML Tutorials */ ],
"css": [ /* CSS Tutorials */ ],
"javascript": [ /* JS Tutorials */ ],
"php": [ /* PHP Tutorials */ ],
"misc": [ /* Misc Tutorials */ ],
"documentation": [ /* DevPanicZone Tutorials */ ]
}
}
Woher kommen die Daten?
| Feld | Quelle |
|---|---|
title |
CUSTOM_TITLES oder H1 der Seite |
excerpt |
.hero-subtitle oder .hero-text (max. 160 Zeichen) |
url |
Dateipfad relativ zum Root |
category |
Ordnername (html, css, etc.) |
badgeClass |
Generiert aus Kategorie für CSS-Styling |
Das Frontend Script
Die Datei /assets/js/latest-tutorials.js ist verantwortlich für das
Laden und Rendern der Cards.
Die createTutorialCard Funktion
Diese Funktion erstellt das HTML für jede Card:
function createTutorialCard(tutorial) {
const card = document.createElement('article');
card.className = 'tutorial-card';
card.innerHTML = `
<a href="${tutorial.url}">
<span class="card-badge ${tutorial.badgeClass}">
${tutorial.categoryDisplay}
</span>
<h3 class="card-title">${tutorial.title}</h3>
<p class="card-description">
${tutorial.excerpt || 'Tutorial entdecken...'}
</p>
<span class="card-link">Tutorial lesen →</span>
</a>
`;
return card;
}
Container-Erkennung
Das Script prüft automatisch, welcher Container vorhanden ist:
// Startseite: Neueste Tutorials (aus LATEST_TUTORIALS)
if (latestContainer) {
renderLatestTutorials(latestContainer, data.latest);
}
// Kategorieseite: Tutorials dieser Kategorie
if (categoryContainer) {
const category = categoryContainer.dataset.category;
const latestInCategory = data.byCategory[category].slice(-4).reverse();
renderLatestTutorials(categoryContainer, latestInCategory);
}
CSS Styling
Die Styles für die Tutorial Cards befinden sich in /assets/css/components.css:
Das Grid
/* Tutorial Grid: 1 Spalte mobil, 2 Spalten Desktop */
.tutorials-grid {
display: grid;
grid-template-columns: 1fr;
gap: 1.5rem;
}
@media (min-width: 768px) {
.tutorials-grid {
grid-template-columns: repeat(2, 1fr);
}
}
Die Cards
.tutorial-card {
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 1.5rem;
transition: all 0.2s ease;
}
.tutorial-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
Farbcodierte Badges
.card-badge-html { background: var(--accent-blue); }
.card-badge-css { background: var(--accent-green); }
.card-badge-bootstrap { background: var(--accent-purple); }
.card-badge-javascript { background: var(--accent-orange); }
.card-badge-php { background: var(--accent-cyan); }
.card-badge-misc { background: var(--accent-red); }
Zusammenfassung
Startseite
- ID:
#latestTutorials - Zeigt: Die 4 aus
LATEST_TUTORIALS - Manuell gepflegt
Kategorieseiten & Tutorials
- ID:
#categoryLatestTutorials - Attribut:
data-category="xxx" - Zeigt: Die letzten 4 der Kategorie
Checkliste für neue Tutorials
- Tutorial in
TUTORIAL_ORDEReintragen - Optional: In
LATEST_TUTORIALSoben einfügen npm run buildausführen- Fertig! Die JSON wird automatisch aktualisiert
Mehr aus DevPanicZone!
Tutorials werden geladen...