URL-AddOn: PDF-Endung zu URL hinzufügen

Quell-ID: GitHub Discussion #28

Use Case

Mit dem URL-AddOn (url2) sollen Downloads aus YForm ausgespielt werden. Browser wie Chrome und Edge erkennen PDFs nicht korrekt, wenn die URL keine .pdf-Endung hat.

Verwendete AddOns

  • URL (url2)
  • YForm

Problemstellung

Die generierten URLs enthalten keinen Punkt und keine Dateiendung. Die integrierten PDF-Viewer der Browser funktionieren dadurch nicht korrekt.

Lösung

Über den Extension Point URL_PRE_SAVE kann die URL vor dem Speichern angepasst werden:

<?php
// In boot.php des project-AddOns

rex_extension::register('URL_PRE_SAVE', static function (rex_extension_point $ep) {
    $params = $ep->getParams();
    $url = $params['object'];
    $profileId = $params['profile_id'];

    // Nur für Profil 11 (PDF-Downloads) anwenden
    if ($profileId == 11) {
        $newUrl = new \Url\Url($url->__toString() . '.pdf');
        return $newUrl;
    }
    
    return $params['object'];
});

Parameter des Extension Points

Parameter Beschreibung
object Das Url-Objekt
article_id Die Artikel-ID
clang_id Die Sprach-ID
profile_id Die Profil-ID aus dem URL-AddOn

Besserer Ansatz

Dynamische Erkennung des Dateityps

<?php
rex_extension::register('URL_PRE_SAVE', static function (rex_extension_point $ep) {
    $params = $ep->getParams();
    $url = $params['object'];
    $profileId = $params['profile_id'];

    // Profile, die Dateiendungen benötigen
    $fileProfiles = [
        11 => 'pdf',   // PDF-Downloads
        12 => 'xml',   // XML-Feeds
        13 => 'json',  // JSON-Endpoints
    ];

    if (isset($fileProfiles[$profileId])) {
        $extension = $fileProfiles[$profileId];
        $urlString = $url->__toString();
        
        // Nur hinzufügen, wenn nicht bereits vorhanden
        if (!str_ends_with($urlString, '.' . $extension)) {
            return new \Url\Url($urlString . '.' . $extension);
        }
    }

    return $params['object'];
});

Mit Content-Type-Header (Alternative)

Statt die URL anzupassen, kann auch der Content-Type korrekt gesetzt werden:

<?php
// Im Ausgabe-Modul oder Controller

if ($isPdfDownload) {
    header('Content-Type: application/pdf');
    header('Content-Disposition: inline; filename="' . $filename . '"');
    readfile($pdfPath);
    exit;
}

URL-Profil mit Suffix konfigurieren

Im URL-AddOn kann das Profil direkt mit einem Suffix konfiguriert werden:

  1. Im Backend zu “URL” > “Profile” navigieren
  2. Das entsprechende Profil bearbeiten
  3. Im Feld “Suffix” .pdf eintragen

Diese Variante ist oft einfacher als die programmtische Lösung.

Hinweis zur URL-Struktur

Bei der Verwendung von Dateiendungen in URLs sollte die SEO-Perspektive berücksichtigt werden:

  • /downloads/handbuch.pdf – Klar als PDF erkennbar
  • /downloads/handbuch/ – Saubere URL-Struktur

Für Downloads empfiehlt sich die Variante mit Dateiendung, für reguläre Seiten die saubere URL ohne Endung.