Die gesamte Logik für die Ausgabe von Podcast-Episoden wurde aus den Modulen und Templates ins Addon überführt. Dies ermöglicht:
- Standalone-Nutzung: Das Addon kann unabhängig von spezifischen Modulen/Templates verwendet werden
- Wiederverwendbarkeit: Die Logik kann in verschiedenen Kontexten (Module, Templates, APIs, CLIs) genutzt werden
- Wartbarkeit: Zentrale Logik-Verwaltung statt verstreut über multiple Dateien
- Testing: Leichter zu testen durch klare, isolierte Klassen
- Erweiterbarkeit: Neue Output-Formate können einfach hinzugefügt werden
Location: redaxo/src/addons/podcastmanager/lib/PodcastOutput.php
Behandelt die Rendering-Logik für Frontend-Ausgaben:
// Nutzung im Modul
$output = new PodcastOutput([
'mode' => 'overview', // 'start', 'overview', 'detail'
'show_teaser' => true, // Show description
'limit' => 10, // Episode limit
'show_audio' => true, // Show player
'width' => 12, // Bootstrap column width
]);
echo $output->render(); // Gibt HTML aus
echo $output->renderWithAssets(); // Mit CSS/JSVerfügbare Modi:
overview- Listet alle Episoden als Teasers aufstart- Zeigt erste Episode mit Player + Teaser-Listedetail- Einzelne Episode mit vollem Player und Info
Methoden:
render()- Gibt HTML des aktuellen Modus ausrenderWithAssets()- Inkludiert CSS/JS AssetsrenderItem($item)- Einzelne Episode als TeaserrenderHeader($item)- Episode mit PlayerrenderPlayer($item)- Audio PlayerrenderDetail()- Detail-AnsichtrenderOverview()- Übersichts-AnsichtrenderStart()- Start-Ansicht
Location: redaxo/src/addons/podcastmanager/lib/PodcastRSS.php
Generiert RSS-Feeds in verschiedenen Formaten:
// RSS Generator
$rss = new PodcastRSS();
// iTunes Podcast Feed (Standard)
echo $rss->generate('itunes');
// Klassischer RSS 2.0
echo $rss->generate('rss2');Unterstützte Formate:
itunes- iTunes-kompatibles Podcast-Formatrss2- Klassisches RSS 2.0 Format
Methoden:
generate($format)- Generiert vollständigen RSS-FeedgenerateITunesFeed()- iTunes Podcast FeedgenerateClassicRssFeed()- RSS 2.0 Feed
Location: redaxo/data/addons/developer/modules/Podcast Manager Output/output.php
<?php
if (rex::isBackend()) {
echo "PODCAST output - nur auf der Webseite sichtbar.";
} else {
// Konfiguration zusammenstellen
$config = [
'mode' => 'REX_VALUE[1]',
'show_teaser' => (bool)"REX_VALUE[2]",
'limit' => ((int)"REX_VALUE[3]" != 0) ? "REX_VALUE[3]" : '',
'show_audio' => (bool)"REX_VALUE[4]",
'width' => ((int)"REX_VALUE[6]" != 0) ? "REX_VALUE[6]" : 12,
];
// Output über Addon-Klasse rendern
$output = new PodcastOutput($config);
echo $output->renderWithAssets();
}REX_VALUE Definitionen:
REX_VALUE[1]- Modus ('start', 'overview', 'detail')REX_VALUE[2]- Teaser mit/ohne Description (0/1)REX_VALUE[3]- Limit für EpisodenREX_VALUE[4]- Player an/aus (0/1)REX_VALUE[5]- reserviertREX_VALUE[6]- Column width Bootstrap (12)
Location: redaxo/data/addons/developer/templates/PODCAST MANAGER RSS/template.php
<?php
if("REX_ARTICLE_ID" != "234")
rex_response::sendContentType('application/xml; charset=utf-8');
// Determine feed format (classic RSS or iTunes)
$feed_format = rex_get("feed_version") !== "classic" ? 'itunes' : 'rss2';
// Create RSS generator and output
$rss = new PodcastRSS();
echo $rss->generate($feed_format);
exit;Das HTML des Output ist 100% identisch geblieben. Nur die Verwaltung der Logik hat sich geändert.
Modul/Template
├─ SQL Queries
├─ Helper Functions
├─ HTML Rendering
└─ Output
Modul/Template (einfach, nur Konfiguration)
↓
Addon-Klasse (PodcastOutput/PodcastRSS)
├─ SQL Queries
├─ Datenverarbeitung
├─ HTML Rendering
└─ Output
$output = new PodcastOutput([
'mode' => 'overview',
'limit' => 20,
'show_teaser' => true,
]);
echo $output->renderWithAssets();$rss = new PodcastRSS();
echo $rss->generate('itunes');// Custom snippet
$output = new PodcastOutput([
'mode' => 'start',
'width' => 6,
]);
$html = $output->render();
// Weitere Verarbeitung...// Custom API Endpoint
class PodcastAPI {
public function getEpisodes() {
$output = new PodcastOutput(['mode' => 'overview']);
return $output->render();
}
}[
'mode' => 'overview', // Render-Modus
'show_teaser' => true, // Teaser anzeigen
'limit' => '', // Anzahl Episodes
'show_audio' => true, // Player anzeigen
'width' => 12, // Bootstrap width (1-12)
'detail_id' => 93, // Detail Artikel ID
'order' => 'DESC', // Sortierung
]Verwendet automatisch alle rex_config::get('podcastmanager', ...) Einstellungen:
feed_title- Podcast Titelfeed_link- Website URLfeed_description- Beschreibungfeed_author- Autor Namefeed_email- Kontakt Emailfeed_image- Cover Imagefeed_explicit- Explicit Content (yes/no/clean)feed_category- iTunes Kategoriefeed_subcategory- iTunes Unterkategorie
✅ Modularität - Logik ist nicht an Module/Templates gebunden
✅ Wiederverwendbarkeit - Kann überall im Projekt genutzt werden
✅ Testing - Klassen können isoliert getestet werden
✅ Wartbarkeit - Zentrale Logik-Verwaltung
✅ Erweiterbarkeit - Neue Modi/Formate leicht hinzufügbar
✅ Performance - Keine redundante Logik
✅ Konsistenz - Ein Output-Standard für alle Kontexte
// Viel Inline-Code, Helper Functions, direkte SQL Queries
$pod_items = rex_sql::factory()->getArray('SELECT...');
foreach ($pod_items as $item) {
$item = podcastmanager::prepare($item, $track_url);
// HTML Rendering hier...
}// Nur noch Konfiguration und Rendering
$output = new PodcastOutput(['mode' => 'overview']);
echo $output->render();// In PodcastOutput Klasse
private function renderCustomMode() {
// Deine Custom Logik
return $html;
}
// In render() Method
case 'custom':
return $this->renderCustomMode();// In PodcastRSS Klasse
public function generate($format = 'itunes') {
if ($format === 'custom') {
return $this->generateCustomFeed();
}
// ...
}
private function generateCustomFeed() {
// Custom Feed Generation
}// Konfiguration prüfen
$output = new PodcastOutput(['mode' => 'overview']);
echo $output->render();
// Mit Debug-Infos
$config = [
'mode' => 'overview',
'limit' => 5,
'show_teaser' => true,
];
$output = new PodcastOutput($config);
// HTML wird mit aktuellen Einstellungen gerendert- Lazy Loading - Assets nur laden wenn nötig
- Single Queries - Optimierte Datenbankabfragen
- HTML Caching - Output kann gecacht werden
- Keine redundanten Operationen - Zentrale Logik
Die neue Architektur ermöglicht es dem podcastmanager Addon, komplett unabhängig zu funktionieren. Module und Templates dienen jetzt nur noch als dünne Wrapper um die zentrale Addon-Logik. Dies macht das Addon:
- 🎯 Standalone-Nutzbar
- 🔧 Leicht wartbar
- 📦 Wiederverwendbar
- 🚀 Leicht erweiterbar