Schnellnavigation:

Kategorien

« Mai 2024»
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Letzte Nachrichten

DSGVO
26.05.2018 18:39
Trackingtools und Datenschutzerklärung
14.03.2014 23:07
1:n und n:1 Relationen in Extbase
06.12.2013 12:04
Erste Abmahnungen wegen Google Analytics
04.10.2013 12:11

Kopieren Sie diesen Link in Ihren RSS-Reader

RSS 0.91Nachrichten
RSS 2.0Nachrichten

In eigener Sache

Peter Linzenkirchner, Lisardo EDV Beratung in Augsburg. Freelance und Partner für Design- und Webagenturen in Augsburg und München. Pixelgenaue Templates, valides HTML, barrierearm. TYPO3-Projekte, Extension-Programmierung und mehr ... 

Zur Zeit wird gefiltert nach: rte
Filter zurücksetzen

Im RTE kann man horizontale Linien einfach mittels Blockstilen zur Verfügung stellen, die einem Absatz zugewiesen werden können. Diese Stile müssen allerdings vom Entwickler zur Verfügung gestellt werden. 

Dieser Absatz hat z. B. eine Linie oberhalb, die auf diese Art eingefügt wurde. 

Der RTE kann allerdings auch das HTML-Element <hr /> einsetzen, das unabhängig ist von den Blockelementen bzw. Absätzen.

Standardmäßig macht der RTE dabei leider einen Fehler: er packt die Linie in einen Absatz: <p><hr /></p>, was beim Validieren der Seite zu einem Fehler führt. Dieser Fehler stört allerdings die optische Darstellung nicht, wer also mit einem Validierungsfehler leben kann, muss nichts weiter unternehmen. 

Der Fehler kann eleminiert werden, wenn in das TypoScript-Template der Seite diese Zeilen eingefügt werden:

  1. lib.parseFunc_RTE.externalBlocks := addToList (hr)
  2. lib.parseFunc_RTE.externalBlocks.hr.stripNL = 1

Leider hat das aber andere negative Konsequenzen. Wenn ich z. B. hier so eine Linie einfüge:


werden die folgenden Absätze nicht mehr richtig geparst. So werden z. B. in meinen Code-Snippets der <pre>-Tag nicht mehr korrekt von  tx-vjrtecodesnippets erkannt und geparst: 

lib.parseFunc_RTE.externalBlocks := addToList (hr)
lib.parseFunc_RTE.externalBlocks.hr.stripNL = 1


Ausserdem werden offensichtlich Links nicht mehr geparst. Das ganze ist ein Problem, das offenbar seit 2007 im Bugtracker steht, aber bis heute nicht wirklich gelöst wurde (hier sollte eigentlich ein Link stehen, der aber nicht geparst wird. Er folgt im nächsten Absatz, den ich in ein neues Inhaltselement packe.) 

Fazit:

Ich empfehle die Verwendung von Blockstilen wie ganz oben beschrieben. Wenn man unbedingt <hr /> verwenden muss, so sollte der Workaround gründlich getestet werden. Wenn – wie bei mir hier – die Fehler nicht gefixt werden können, dann muss man wohl oder übel mit dem Syntaxfehler des RTE leben. Wie gesagt: die Darstellung ist ja korrekt, es gefällt nur den Validatoren nicht.

Und hier ist der Link in den Bugtracker nochmals ...

[Update]
Für den Bug gibt es seit kurzem einen Fix im Bugtracker von Stanislas Rolland, der das Problem behebt. (Vielen Dank an Stanislas!)

Also Patch einspielen, oder aufs nächste Update von TYPO3 warten, dann wirds wohl dabei sein. 

[Update 2]

In Version 4.4.6 funktioniert es jetzt. 

Kategorien: Tipps/Typoscript  Kommentare 0
Tags: rte
01September2010

Custom Tags im RTE

In der Grundkonfiguration entfernt der RTE eine Reihe von nicht erwünschten Tags. Je nach eingestellter Grundkonfiguration erhält er eigene Tags, löscht diese oder wandelt sie in Entities um. Um eigene Tags zu ermöglichen, sollte deshalb der  Konfiguration des RTE einiges hinzugefügt werden. 

  1. RTE.default.proc.allowTags:=addToList(sondertag)
  2. RTE.default.proc.allowTagsOutside:=addToList(sondertag)
  3. RTE.default.proc.entryHTMLparser_db.allowTags<RTE.default.proc.allowTags

Anstatt der Schreibweise := addToList(sondertag) können natürlich auch alle Tags aufgeführt werden, z. B. so:

  1. RTE.default.proc {
  2.         allowTags(
  3.             a,abbr,acronym,b,bdo,blockquote,br,cite,code,col,colgroup,del,dfn,div,em,
  4.             h1,h2,h3,h4,h5,h6,hr,i,img,li,ol,p,span,strike,strong,sub,sup,
  5.             table,thead,tbody,tfoot,td,tr,th,ul,sondertag,
  6.         )
  7. }

Das ist natürlich umständlicher, aber man weiss genau, was man erlaubt hat und was nicht.

Damit der Tag im Frontend ausgegeben wird, muss zusätzlich im TypoScript des Templates noch folgendes hinzugefügt werden:

  1. lib.parseFunc_RTE.allowTags:=addToList(sondertag)

Beziehungsweise für alle Texteingabefelder, die nicht den RTE benutzen:

  1. lib.parseFunc.allowTags:=addToList(sondertag)

In der Regel wird man aber den eigenen Tag nicht im Frontend ausgeben wollen, sondern man möchte ihn auf eine bestimmte – individuelle – Art parsen. Das kann mit Hilfe eines eigenen PHP-Skripts erfolgen oder über eine TypoScript-Konfiguration.

Für ein eigenes PHP-Skript kann man eine eine Extension anlegen und das hier ins Setup des TypoScript-Templates schreiben:

  1. # eigenes PHP-Script:
  2. lib.parseFunc.tags.sondertag= <plugin.tx_eigenExtension_pi1

Man kann aber auch im Kickstarter eine Extension anlegen, die sich im das Parsen eines einzigen Tags kümmert. In der Auswahl der Frontendplugins gibt es am Ende der Liste die Option, einen Custom Tag zu verarbeiten. In diesem Fall muss nichts mehr ins Setup geschrieben werden, da die Einbindung das localconf der neuen Extension übernimmt.

Oder man geht komplett über TypoScript, zum Beispiel so:

  1. # über TS
  2. lib.parseFunc_RTE.tags.myTag=TEXT
  3. lib.parseFunc_RTE.tags.myTag {
  4.     # mit current=1 enthält man den aktuellen Inhalt des Tags
  5.     current=1
  6.     # eigenes wrap, z. B. für Boxen
  7.     wrap(
  8.         <divclass="box">
  9.             <divclass="top"></div>
  10.                 <divclass="center">|</div>
  11.             <divclass="bottom"></div>
  12.         </div>
  13.     )
  14.     # Leerzeilen vor und nach dem Inhalt des Tags entfernen
  15.     stripNL=1
  16. }

Einfügen über User-Elemente

Eigene HTML-Tags zu erlauben ist natürlich nur der erste Schritt – wir müssen es den Redakteuren noch ermöglichen, diese auch einzugeben. Normalerweise werden diese Tags nämlich bei der Eingabe bereits in Entities umgewandelt. Man könnte natürlich auf die HTML-Eingabe umschalten oder den RTE vorübergehen deaktivieren, aber das ist eigentlich nicht zumutbar.

Wir können es aber über eine eigene Bibliothek mit User-Elementen ermöglichen.

Zuerst muss das »user«-Werkzeug erlaubt werden. Dazu muss es entweder unter »showButtons« hinzugefügt oder bei »hideButtons« ausgelassen werden. Je nachdem, wie man prinzipiell den RTE konfiguriert hat. Ich gehe über hideButtons und lösche dort »user« aus der Liste:

  1. RTE.default{
  2.     hideButtons(
  3.         lefttoright,righttoleft,formattext,bidioverride,big,
  4.         citation,definition,insertedtext,italic,keyboard, 
  5.         monospaced,sample,small,span,strikethrough,
  6.         variable,bold,underline,fontstyle,fontsize,
  7.         blockquote,insertparagraphbefore,insertparagraphafter,inserthorizontalrule,
  8.         spellcheck,emoticon,inserttag,copy,cut,paste,
  9.         justifyfull,textcolor,bgcolor,
  10.     )
  11. }

Danach sollte im RTE ein Werkzeug auftauchen mit dem Tooltipp »Insert custom element«. Bei Klick öffnet sich ein Dialog, mit dem die neuen Elemente eingefügt werden können. Damit die Elemente zur Vefügung stehen, müssen diese noch konfiguriert werden:

  1. RTE.default{
  2.     userElements {
  3.         10=Eigene Sondertags
  4.         10 {
  5.             1=Sondertag
  6.             1.description=Der ausgewählte Text wird umschlossen von<sondertag></sondertag>
  7.             1.mode=wrap
  8.             1.content= <sondertag>|</sondertag>
  9.         }
  10.     }
  11. }

Dabei bildet »10« eine Kategorie mit der Bezeichnung »Eigene Sondertags« und »1» ist das erste Element. Die folgenden Elemente dieser Kategorie beginnen mit »2«, »3« und so weiter. Wichtig ist die Angabe des Modus – damit wird erreicht, dass der markierte Text vom Content umgeben wird.

Mit dieser Technik können nicht nur Tags ermöglicht werden, sondern es können Bilder oder Textbausteine zur Verfügung gestellt werden oder auch weiterführende Formatierungen mit <div>-Containern. Es können sogarPHP-Skript darüber aufgerufen werden, die markierte Inhalte vor der Übergabe verarbeiten.

Fehler / Probleme

Bei uns tauchte gelegentlich das Problem auf, dass bei <div>-Containern, die auf diese Art in den RTE eingefügt wurden, bei der Ausgabe ins Frontend der äusserste Container in einen p-Tag umgewandelt wurde. Da in einen p-Tag kein <div> geschachtelt werden darf, hat das unangenehme Konsequenzen – unter Umständen auf das Rendering der gesamten Seite. Dieser Fehler ist ein Feature und kann abgeschaltet werden durch diesen Eintrag ins TypoScript Setup:

  1. ### das hier verursacht den Fehler:
  2. lib.parseFunc_RTE.nonTypoTagStdWrap.encapsLines.remapTag.DIV=P
  3. ### so abschalten:
  4. lib.parseFunc_RTE.nonTypoTagStdWrap.encapsLines.remapTag.DIV>

Dieser Eintrag soll eigentlich dafür sorgen, dass versehentlich eingefügte <div>-Tags durch Absätze ersetzt werden. Bei einigermaßen guter Konfiguration des RTE ist dieses Feature aber überflüssig und kann abgeschaltet werden.

Weiterführende Links

  • Manual auf Typo3.org Hinweis: das Manual ist nicht auf dem üblichen Weg zu finden; die Extension gehört zwar mittlerweile zur Standardinstallation, aber sie wird in der Core-Dokumentation gelistet. Es gibt deshalb eine eigene Extension nur für das Manual von htmlArea RTE. Interessant sind hier vor allem die Abschnitte »userCategory« und »userElements«
  • Tags Der Abschnitt über eigene Tags in TSref. 
Kategorien: Backend/Typoscript  Kommentare 0
Tags: rte, tag

Es besteht die Möglichkeit Konstanten zu definieren, die im RTE bzw. in allen Texteingabefeldern verwendet werden können. Diese Konstanten werden im RTE einfach in dieser Schreibweise eingefügt: ###MEINE_KONSTANTE###. Bei der Ausgabe im Frontend können diese Konstanten gegen einen vorgegeben Text oder gegen ein HTML-Snippet ersetzt werden.

Dazu müssen die Konstanten lediglich auf der obersten Ebene im Setup des TypoScript-Templates definiert werden:

  1. ##### Konstanten definieren #####
  2. constants.MEINE_KONSTANTE= <span class="myClass">irgend ein Text</span>
  3.  

Verantwortlich dafür sind diese Einträge, die standardmäßig eingeschaltet sind:

  1. lib.parseFunc.constants=1
  2. lib.parseFunc_RTE.constants=1

Damit wird sowohl im RTE wie in allen Texteingabefeldern die Ersetzung der Konstanten eingeschaltet. Das gilt auch für die Eingabefelder von Extensions, soweit diese durch eine der beiden Funktionen geparst werden.

Platzhalter oder Abkürzungen

Neben diesen Konstanten können Abkürzungen oder Ausdrücke definiert werden, die bei der Ausgabe ins Frontend ersetzt oder expandiert werden. Diese Abkürzungen oder Platzhalter müssen im TypoScript-Setup zunächst definiert werden:

  1. ##### Abkürzungen definieren
  2. lib.parseFunc_RTE.short {  
  3.     T3= <span class="test">Typo3</span>
  4. }

Dabei ist darauf zu achten, dass diese Definition diesmal nicht global erfolgt sondern lokal; um sie also auch in anderen Textfeldern verwenden zu können müssen sie für die normale parseFunc nochmals definiert werden.

Im RTE muss nur die Abkürzung oder der Platzhalter eingegeben werden – es ist keine weitere Auszeichnung erforderlich. Im obigen Beispiel wird ein alleinstehendes »T3« im Frontend automatisch durch »Typo3« in einem span-Tag ersetzt. Allerdings sollte dabei bedacht werden, dass diese Abkürzungen immer ersetzt werden; sinnvoll wären also nur eindeutige Abkürzungen.

Weiterführende Links

Der Abschnitt über die ParseFunc im TSconfig.

Achtung Update!

Dieser Artikel ist schon einigermaßen alt – im wesentlichen stimmen die hier beschriebenen Techniken noch, aber zur Zeit läuft vor allem die Extension linkhandler nicht in TYPO3 in Version 6.x. Sie wirft im Backend solche Fehler, dass es nicht mehr zugänglich ist. Also mein Tipp: auf keinen Fall über den Extensionsmanager installieren, sondern diesen Fork von Github verwenden. Einfach herunterladen, das zip-Archiv auspacken und den entstehenden Ordner umbenennen in »linkhandler«. 

Eine Anpassung an die neue News-Extension findet ihr in einem neueren Artikel zu diesem Thema: Links im RTE auf News-Einträge mit der Extension linkhandler

Mit der Extension linkhandler können im RTE (bzw. in den normalen Inhaltselementen) Links auf News-Einträge oder auf beliebige sonstige Datensätze erstellt werden. Sie funktioniert sehr gut und lässt sich ideal konfigurieren.

Installation

Normal installieren und nicht vergessen, das statische Template einzubinden. Danach funktioniert die Extension insoweit, dass man Links im RTE erstellen kann; allerdings werden diese noch nicht im Frontend geparst. Das muss über TypoScript erst konfiguriert werden.

Konfiguration des Link-Browsers im RTE

Dazu folgende Zeilen im TSconfig der Rootseite eingeben (bzw. der Seite, die auch die restliche Konfiguration des RTE enthält)

  1. # das erstellt einen neuen Tab im Linkbrowser. Es können mehrere erstellt werden,
  2. # für jede Tabelle aber nur einer.
  3. RTE.default.tx_linkhandler {
  4.   # Browser für tt_news-Datensätze
  5.   tt_news {
  6.       # Das steht im Tab als Label
  7.       label=Label des Tabs
  8.       # die Tabelle, die die gewünschten Datensätze enthält
  9.       listTables=tt_news
  10.       # nur die Seiten im Seitenbaum zeigen, die auch die
  11.       # gewünschen Datensätze enthalten.
  12.       onlyPids=28,65
  13.   }
  14. }

Konfiguration der Links

Die Links müssen im TypoScript-Setup konfiguriert werden. Die einfache Variante verwendet nur eine einzige Zielseite für die Singledarstellung der News:

  1. plugin.tx_linkhandler {
  2.   tt_news {
  3.       # uid der Seite, auf der die Singledarstellung der News erfolgt
  4.       parameter = 25
  5.       # weitere Parameter, insbesondere die richtige uid der News
  6.       additionalParams=&tx_ttnews[tt_news]={field:uid}
  7.       # nötig, damit {field:uid} ersetzt wird
  8.       additionalParams.insertData=1
  9.       # wichtig, damit cachen möglich ist. 
  10.       useCacheHash=1
  11.       # versteckte News können nicht gelinkt werden
  12.       forceLink = 0
  13.   }
  14. }

Eine etwas komplexere Variante, die abhängig von der pid der News-Datensätze eine andere Seite für die Single-Darstellung aufruft:

  1. plugin.tx_linkhandler {
  2.   tt_news {
  3.       title=TEXT
  4.       title.data = field:title
  5.       parameter.stdWrap.cObject = CASE
  6.       parameter.stdWrap.cObject {
  7.           # abhängig vom Eintrag in pid der News-Tabelle
  8.           key.field = pid
  9.           # falls dieser 65 lautet
  10.           65 = TEXT
  11.           # wird parameter auf 85 gesetzt, der uid der
  12.           # Zielseite mit der Single-Darstellung
  13.           65.value = 85
  14.           # Default für alle anderen Werte in pid
  15.           default = TEXT
  16.           # Zielseite mit uid 25
  17.           default.value = 25
  18.       }
  19.       additionalParams=&tx;_ttnews[tt_news]={field:uid}
  20.       additionalParams.insertData=1  
  21.       useCacheHash=1
  22.       forceLink = 0
  23.   }
  24. }

Man kann auch beliebige andere Tabellen ansprechen, auch aus eigenen Extensions. Hier ein Beispiel im TSConfig, das weitere Reiter im Dateibrowser des RTE erzeugt, die auf Datensätze von eigenen Extensions zugreifen:

  1. RTE.default.tx_linkhandler { {
  2.   buecher {
  3.       label = Buchtitel
  4.       listTables=tx_buchtitel_liste
  5.       onlyPids=68
  6.   }
  7. }

Dazu dann diese Entsprechung in Setup für das Verarbeiten der Links:

  1. plugin.tx_linkhandler {
  2.   tx_buchtitel_liste {
  3.       parameter = 69
  4.       additionalParams=&myParam;={field:uid}
  5.       additionalParams.insertData=1  
  6.       useCacheHash=1
  7.       forceLink = 0
  8.      
  9.   }
  10. }

Dabei ist tx_buchtitel_liste der Name der SQL-Tabelle, parameter die uid der Zielseite mit der Single-Darstellung. So können beliebig viele Reiter im RTE angelegt werden, die auf Datensätze in beliebigen Tabellen verweisen.

Linkhandler für t3blog

Die Einstellungen für t3blog funktionieren prinzipiell genauso. Zunächst das TSconfig:

  1. RTE.default.tx_linkhandler {
  2.   # tt_news deaktivieren, da vordefiniert:
  3.   tt_news >
  4.   tx_t3blog_post {
  5.       # Das steht im Tab als Label
  6.       label=T3Blog
  7.       # die Tabelle, die die gewünschten Datensätze enthält
  8.       listTables=tx_t3blog_post
  9.       # nur die Seiten im Seitenbaum zeigen, die auch die
  10.       # gewünschen Datensätze enthalten.
  11.       onlyPids=###hierDieEigenePid###
  12.   }
  13. }

Im Setup gibt es aber eine Besonderheit, da für Links auf einen Blogeintrag  neben der uid des Postings auch das Datum iausgegeben werden muss – zumindest ist das erforderlich, wenn RealURL eingesetzt wird. Hier hilft die stdWrap-Funktion mit cObject weiter: 

  1. plugin.tx_linkhandler {
  2.   tx_t3blog_post {
  3.       parameter = ###deinePID###
  4.       # weitere Parameter, hier als cObject
  5.       additionalParams.stdWrap.cObject = COA
  6.         additionalParams.stdWrap.cObject {
  7.             1 = LOAD_REGISTER
  8.             1 {
  9.               year {
  10.                   field = date
  11.                   strftime = %Y
  12.               }
  13.               month {
  14.                   field = date
  15.                   strftime = %m
  16.               }
  17.               day {
  18.                   field = date
  19.                   strftime = %d
  20.               }
  21.             }
  22.            
  23.             10 = TEXT
  24.             10 {
  25.               value = &tx_t3blog_pi1[blogList][showUid]={field:uid}&tx_t3blog_pi1[blogList][year]={register:year}&tx_t3blog_pi1[blogList][month]={register:month}&tx_t3blog_pi1[blogList][day]={register:day}
  26.               insertData = 1
  27.             }
  28.            
  29.         }
  30.       }
  31.       # wichtig, damit Cachen möglich ist. 
  32.       useCacheHash=1
  33.       # versteckte News können nicht gelinkt werden
  34.       forceLink = 0
  35.   }
  36. }