OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

_attachment_helpers.php

2 KB
<?php
/**
 * Helfer für Datei-Anhänge (modulübergreifend).
 *
 * att_view_link() rendert den "Auge"-Vorschau-Button, der die gemeinsame
 * Lightbox (templates/partials/_attachment_modal.php) öffnet. Nur Bilder und
 * PDFs sind vorschaufähig – diese Typen werden inline (gleiche Origin)
 * ausgeliefert (vgl. INLINE_SAFE_MIME). Für alle anderen Dateien wird kein
 * Button gerendert (leerer String).
 */

if (!function_exists('att_preview_type')) {
    /** @return string 'pdf', 'image' oder '' (nicht vorschaufähig) */
    function att_preview_type(string $filename, string $mime = ''): string
    {
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        if ($ext === 'pdf' || $mime === 'application/pdf') {
            return 'pdf';
        }
        $imgExt  = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
        $imgMime = ['image/png', 'image/jpeg', 'image/gif', 'image/webp'];
        if (in_array($ext, $imgExt, true) || in_array($mime, $imgMime, true)) {
            return 'image';
        }
        return '';
    }
}

if (!function_exists('att_view_link')) {
    /**
     * Vorschau-Button (Auge). Öffnet Bilder/PDFs in der Lightbox.
     * Liefert leeren String, wenn die Datei nicht vorschaufähig ist.
     *
     * @param string $viewUrl  Inline-Auslieferungs-Endpunkt (.../view)
     * @param string $cls      CSS-Klasse des Buttons (modulspezifisch)
     */
    function att_view_link(string $viewUrl, string $filename, string $mime = '', string $cls = 'cs-file-view'): string
    {
        $type = att_preview_type($filename, $mime);
        if ($type === '') {
            return '';
        }
        $u = htmlspecialchars($viewUrl, ENT_QUOTES);
        $n = htmlspecialchars($filename, ENT_QUOTES);
        return '<a href="' . $u . '" class="' . htmlspecialchars($cls, ENT_QUOTES) . '" title="Vorschau"'
             . ' data-att-view="' . $u . '" data-att-view-type="' . $type . '" data-att-view-name="' . $n . '">'
             . '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14">'
             . '<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>'
             . '</a>';
    }
}