Zum Inhalt springen

Dateityp als Klasse bei FAL-Dateilinks

Erstellt am 29. April 2013 · 1 Antwort · letzte Antwort am 29. April 2013

Tags: Dateien & FAL, Links, Frage

Nathanael ·

Moin,

wir haben auf TYPO3 6.0 umgestellt und überarbeiten gerade unsere TemplaVoilà-FCEs. Nun stellt sich uns die Frage, wie wir den Dateityp einer verlinkten Datei bestimmen können und entsprechend andere Klassen bzw. Attribute des Typolinks setzen können. Momentan sieht das Typoscript für den Link wenig überraschend so aus:

10 = TEXT
10 {
  field = field_linklist_linktitle
  typolink.parameter.current = 1
  # gesucht ist etwas wie das Folgende:
  # typolink.ATagParams = class="DATEITYP"
  # oder wenn es sich um ein PDF handelt:
  # typolink.ATagParams = download="download"
}

Nun wäre es wünschswert, wenn wir an der Stelle irgendwie auf den Typ der Datei zugreifen könnten. Konkret wollen wir das HTML5-Attribut "download" für PDFs setzen, aber auch eine automatische Anzeige des Dateityps im Linktext in der Form "Linktext [PDF]" wäre ein Einsatzszenario für diese Information. Erschwerend kommt nun hinzu, dass bei dem Link nicht auf Dateien gelinkt werden kann, sondern natürlich auch auf Seiten. Die Dateitypbestimmung muss sich also natürlich nur auf Links vom Typ FILE beschränken.

Notfalls würde ich das mit einer userFunc erledigen, die würde dann den Dateityp anhand der Endung erkennen (suboptimal) und den Link entsprechend umbauen. Aber es würde mich doch sehr wundern, wenn diese Information nicht auch in Typoscript zur Verfügung stünde, so dass man dort irgendwie darauf reagieren kann. Allerdings konnte ich nichts dazu finden.

Das Einzige, was da in die Nähe kommt, war eine Lösung, die mit einem substr in Typoscript die (unbdeingt dreistellige) Dateiendung herauszieht und dann mit einem CASE darauf reagiert. Das ist aber unflexibel, unübersichtlich und unelegant, zumal es doch sicher eine vorgesehene saubere Lösung gibt, auf Eigenschaften einer mit FAL verlinkten Datei zuzugreifen.

Hat jemand eine Idee?

Nathanael ·

Auf die Schnelle die unelegante Lösung mit einer userFunc. Im TypoScript folgendes

# irgendwo vorher im TS die Bibliothek einbinden:
includeLibs.meinelib = fileadmin/templates/php/meinelib.class.php

# dann beim Link, etwa im FCE, aber im Grunde egal wo:
10 = TEXT
10 {
  field = field_linklist_linktitle
  typolink.parameter.current = 1
  typolink.userFunc = meinelib->addDownloadFileInfoToTypolink
}

Die Datei fileadmin/templates/php/meinelib.class.php enthält folgenden Code:

class meinelib
{
  function addDownloadFileInfoToTypolink($param)
  {
    if ( $param['TYPE'] == 'file' )
    {
      $fileextension = preg_match('/.*\.([a-z0-9]{1,})$/i', $param['url'], $matches);
      if ( isset($matches[1]) )
      {
        if ( in_array($matches[1], array('pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt' , 'pptx')) )
        {
          if ( strpos('class=', $param['TAG']) !== false )
          {
            return preg_replace('/class="(.*?)"/iu', 'class="$1 download ' . $matches[1] . '" download', $param['TAG']);
          }
          else
          {
            return preg_replace('/href="(.*?)"/iu', 'href="$1" class="download ' . $matches[1] . '" download', $param['TAG']);
          }
        }
      }
    }
    return $param['TAG'];
  }
}

Das setzt eine entsprechende Klasse bei Dateilinks auf einige Dateitypen und auch das download-Attribut. Quick and dirty. Schön wäre noch, wenn man die Liste der Dateitypen aus dem TypoScript heraus übergeben könnte, aber userFunk auf TypoLinks kann sowas scheinbar nicht, weil es nicht vom Content-Typ USER ist, sondern nur sowas ähnliches. Oder weiß da jemand mehr?

Wer trotzdem eine TS-only-Lösung parat hat, immer her damit!