Was man in 10 Minuten alles erreichen kann, das hat schon Ede Stoiber in seiner legendären Transrapid-Rede verweifelt versucht, dem Zuhörer verständlich zu machen. In 10 Minuten kann man im Gegensatz dazu aber auch etwas sehr produktives anstellen…
Das Problem
Vielleicht kommt Euch die folgende Situation, zumindest in ähnlicher Form, bekannt vor: Ihr sitzt gerade an einem Typo3-Projekt, habt die Nachrichtenerweiterung tt_news installiert und konfiguriert und bei der Erstellung des Templates fällt Euch auf, dass nicht ausreichend Marker zur Verfügung stehen bzw. die vorhanden Funktionen einfach nicht genügen, um die Vorlage nach Euren individuellen Vorstellungen anzupassen.
Dieser Artikel soll demonstrieren, wie Ihr in rund 10 min einen zusätzlichen Marker (in diesem Fall für einen Ansprechpartner einer Nachricht) inkl. des passenden Eingabefeldes im Typo3 Backend erstellen und somit für mehr Flexibilität in der Arbeit mit tt_news sorgen könnt. Wer Typo3, mit seinen auf den ersten Blick verworrenen Strukturen, als programmiertechnisches Hexenwerk betrachtet, dem sei gesagt: Neue Marker für tt_news anzulegen ist halb so wild.
An dieser Stelle sei noch erwähnt, dass es auch mit Hilfe von hooks und einer eigenen Erweiterung für tt_news möglich ist, neue Marker anzulegen. Viele Wege führen eben nach Rom… diese Beschreibung soll jedoch ein möglichst effizientes Vorgehen aufzeigen und richtet sich v.a. an Typo3- Anwender und User, die sich nicht täglich mit der Programmierung rund um Typo3 befassen.
Die Lösung
0. Sicherung der Quelldateien
Bevor Ihr Euch voller Tatendrang in die Erweiterung stürzt, sichert Euch zunächst bitte die folgenden Orginaldateien, die sich in der Verzeichnisstruktur von tt_news (typo3conf/ext/tt_news/…) befinden:
- tca.php
- pi/class.tx_ttnews.php
- res/tt_news_v3_template.php
- falls benötigt locallang_tca.xml
1. Datenbanktabelle erweitern
Um die im Backend eingegebenen Ansprechpartner zu speichern, benötigen wir zunächst ein zusätzliches Feld in der Datenbanktabelle tt_news. Mit Hilfe des Datenbankadministrationstool phpMyAdmin fügen wir an das Ende der Tabelle ein neues Feld mit dem Namen ‚Ansprechpartner‘.
Wichtig ist bei diesem Schritt die korrekte Deklaration des Feldes. Da es sich bei einem Ansprechpartners zweifelsohne um Wörter, also eine Zeichenkette, handeln wird, wählen wir für das Feld den Datentypen VARCHAR aus. MySQL setzt dabei die Angabe der maximalen Länge des Strings voraus. 128 Zeichen sollten für den Vor- und Zunamen hierbei ausreichen.
Falls Ihr mehr Infos zu den MySQL-Datentypen benötigt oder nicht schlüssig seid, welcher für Euer Feld der Passende ist, dem empfehle ich einen Blick ins übersichtliche Manual von MySQL.
2. Anpassung des Backends (ext/tt_news/tca.php)
Nachdem wir mit dem Anlegen des Datenbankfeldes die notwendige Infrastruktur geschaffen haben, geht es in diesem Schritt nun darum, das Eingabefeld im Backend von Typo3 zu erzeugen und dafür zu sorgen, dass die Daten auch im dafür vorgesehenen Feld der Datenbank gespeichert werden.
Die Datei tca.php (Table Configuration Array) ist für die Anzeige der Formularelemente im Backend sowie für das korrekte Ablegen der Eingaben in der Datenbanktabelle verantwortlich. Drei kleine Ergänzungen im Code sind hier nötig:
PHP-Code (Zeile 25):
$TCA['tt_news'] = Array ( 'ctrl' => $TCA['tt_news']['ctrl'], 'interface' => Array ( 'showRecordFieldList' => 'title,hidden,datetime,starttime, archivedate,category,author,author_email,short,image, imagecaption,links,related,news_files,Ansprechpartner' ),
Das Array $TCA['tt_news'], das für die komplette Konfiguration der Backendanzeige verantwortlich ist, beinhaltet eine Reihe von weiteren Unterarrays. Eines davon (<em>'interface' => Array...</em>) hält für Typo3 die Informationen bereit, welche Eingabefelder auf der Oberfläche geladen werden. In der Liste (<em>'showRecordFieldList' => '...'</em>) fügen wir das Feld <em>Ansprechpartner</em> hinzu, welches wir im folgenden Schritt genauer spezifizieren:
PHP-Code (Zeile 150):
'no_auto_pb' => Array ( 'l10n_mode' => 'mergeIfNotBlank', 'exclude' => 1, 'label' => 'LLL:EXT:tt_news/locallang_tca.xml:tt_news.no_auto_pb', 'config' => Array ( 'type' => 'check' ) ), 'short' => Array ( 'exclude' => 1, 'label' => 'LLL:EXT:lang/locallang_general.php:LGL.subheader', 'l10n_mode' => $l10n_mode, 'config' => Array ( 'type' => 'text', 'cols' => '40', 'rows' => '3' ) ), 'Ansprechpartner' => Array ( 'label' => 'Wer ist der Ansprechpartner?', 'config' => Array ( 'type' => 'input', 'size' => '50', 'max' => '128' ) ),
Wie die anderen Eingabefelder benötigt auch unser neues Formularelement ein eigenes Konfigurationsarray, in dem der Typ, das zugehörige Label etc. festgelegt werden. Zwar ist die Reihenfolge dieser Konfigurationsarrays innerhalb des $tca Arrays unabhängig von der späteren Ausgabe im Backend, der Übersicht halber habe ich es jedoch direkt nach der Kurzbeschreibung eingefügt, also an der Stelle, an der es später auch im Backend angezeigt werden sein soll.
Um sicherzustellen, dass die Eingabe im richtigen Datenbankfeld gespeichert wird, ist für den Namen des Arrays die exakt gleiche Schreibweise, wie der Name des Feldes in der Datenbank (‚Ansprechpartner‘),erforderlich. Mit Hilfe des ‚label‘-Attributs könnt Ihr die Überschrift im Backend entsprechend festlegen. Hier habt Ihr die Möglichkeit entweder direkt einen Wert einzugeben (‚Wer ist der Ansprechpartner?‘) oder einen Wert aus der locallang_tca.xml-Datei, in der die Labels in unterschiedlichen Sprachen festgelegt sind, automatisch einfügen zu lassen (‚LLL:EXT:tt_news/locallang_tca.xml:tt_news.LABELNAME‘). Die letztere Variante ist besonders dann zu empfehlen, wenn Ihr die Mehrsprachigkeit des Backends nutzt, da das Label dann in der jeweiligen Landessprache ausgegeben wird.
Das ‚config‘ -Array ist schließlich für die eigentliche Konfiguration des Formularelements zuständig. Der ‚type‘ gibt dabei an, welcher Typ von Formularelement erzeugt werden soll (Texteingabe, mehrzeilige Textarea, Checkboxen, Radiobuttons etc.). In unserem Beispiel wird für den Ansprechpartner ein einfaches Texteingabefeld angelegt. Die Parameter ’size‘ und ‚max‘ bestimmen die Breite des Textfeldes bzw. die maximale Anzahl an zulässigen Zeichen. Wer hier tiefer einsteigen möchte und mehr Informationen zu den einzelnen Parameteren und Datentypen benötigt, findet in der Dokumentation von Typo3 eine Auflistung aller Typen3 sowie deren zulässige Attribute.
PHP-Code (Zeile 423):
'types' => Array ( '0' => Array('showitem' => 'hidden, type;;;;1-1-1,title;;;;2-2-2,short,Ansprechpartner,bodytext;;2;richtext:rte_transform[flag=rte_enabled|mode=ts];4-4-4, --div--;LLL:EXT:tt_news/locallang_tca.xml:tt_news.tabs.special, datetime;;;;2-2-2,archivedate,author;;3;; ;;;;2-2-2, keywords;;;;2-2-2,sys_language_uid;;1;;3-3-3, --div--;LLL:EXT:tt_news/locallang_tca.xml:tt_news.tabs.media, image;;;;1-1-1,imagecaption;;5;;,links;;;;2-2-2,news_files;;;;4-4-4, --div--;LLL:EXT:tt_news/locallang_tca.xml:tt_news.tabs.catAndRels, category;;;;3-3-3,related;;;;3-3-3, --div--;LLL:EXT:tt_news/locallang_tca.xml:tt_news.tabs.access, starttime,endtime,fe_group,editlock, --div--;LLL:EXT:tt_news/locallang_tca.xml:tt_news.tabs.extended, '),
Die letzte Änderung in der tca.php bezieht sich auf die Position, an der unser Eingabefeld im Backendformular ausgegeben werden soll. Mit Komma getrennt fügen wir es in der Liste ( ’showitem‘ -Array) auf der 1. Seite (‚0‘=>) hinter der Kurzbeschreibung (short) ein. Das wars auch schon.
3. Erstellen des Markers (ext/tt_news/pi/class.tx_ttnews.php)
In der Basisklasse class.tx_ttnews.php der Erweiterung, genauer gesagt in der Funktion function getItemMarkerArray( $row, $lConf, $textRenderObj) werden nun die Marker und die Codefragmente erzeugt, die an der jeweiligen Position des Markers in den HTML Code integriert werden sollen. Alle Marker der tt_news Extension werden in einem assoziativen Markerarray $markerArray[] zwischengespeichert und mit dem jeweiligen Wert versehen.
Mit $markerArray[‚###ANSPRECHPARTNER###‘]=$row[‚Ansprechpartner‘] erstellen wir einen neuen Marker ###ANSPRECHPARTNER### und weisen diesem den Wert aus der Datenbank zu:
PHP-Code:
function getItemMarkerArray($row,...){ ... $markerArray['###ANSPRECHPARTNER###'] = $row['Ansprechpartner']; ... }
Bei dem an die Funktion getItemMarkerArray() übergeben $row-Array handelt es sich um einen kompletten Datensatz aus der Tabelle tt_news der Datenbank. Um an den gespeicherten Wert des Ansprechpartners zu gelangen, verwenden wir die assoziative Schreibweise $row[‚Ansprechpartner‘].
4. Verwendung des Markers im Template (ext/tt_news/res/tt_news_v3_template.html)
Wie auch die Standardmarker von tt_news können auch die Hinzugefügten mit der entsprechenden Schreibweise (###MARKER###) direkt im Template verwendet werden. Unser Ansprechpartner für eine Nachricht lässt sich somit über ###ANSPRECHPARTNER### ins Template einfügen.
5. Unbedingt beachten !!!
Bei einem Update von tt_news werden Eure modfizierten Dateien mit den Codeänderungen automatisch überschrieben und müssen somit nach dem Updatevorgang erneut hinzugefügt werden. Es ist daher dringend zu empfehlen, die angepassten Dateien zu sichern und diese mit einem kurzen Kommentar über die vorgenommenen Änderungen zu versehen. Die Datenbankstrukturen (die hinzugefügten Felder und die bestehenden Einträge) bleiben bei einem Update von tt_news in der Regel erhalten.
Pingback: 10 Minuten… tt_news um neue Marker erweitern « webdesign-bamberg … | Surfemotion-Blog
Pingback: Anonymous